differenza tra #if defined (WIN32) e #ifdef (WIN32)


116

Sto compilando il mio programma che funzionerà su linux gcc 4.4.1 C99.

Stavo solo inserendo le mie #define per separare il codice che verrà compilato su Windows o Linux. Tuttavia, ho ricevuto questo errore.

error: macro names must be identifiers.

Utilizzando questo codice

#ifdef(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

Tuttavia, quando sono passato a questo, l'errore è stato corretto:

#if defined(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif

Mi stavo solo chiedendo perché ho ricevuto quell'errore e perché le #define sono diverse?

Grazie molto,

Risposte:


161

Se usi la sintassi #ifdef, rimuovi le parentesi.

La differenza tra i due è che #ifdefpuò usare solo una singola condizione,
mentre #if defined(NAME)può fare condizionali composti.

Ad esempio nel tuo caso:

#if defined(WIN32) && !defined(UNIX)
/* Do windows stuff */
#elif defined(UNIX) && !defined(WIN32)
/* Do linux stuff */
#else
/* Error, both can't be defined or undefined same time */
#endif

2
sì, ma potresti anche collegare in cascata #ifdef UNIX con #ifndef WIN32 e ottenere la stessa flessibilità (non così leggibile, sono d'accordo)
jpinto3912

2
@ jpinto3912 Ma questo diventa ancora più peloso con||
Aidiakapi

Se solo fossero partiti #if defined(NAME)dall'inizio e avessero evitato di creare una #ifdefdichiarazione.
Andy

51
#ifdef FOO

e

#if defined(FOO)

sono gli stessi,

ma per fare più cose contemporaneamente, puoi usare definito, come

#if defined(FOO) || defined(BAR)

28

#ifdefcontrolla se una macro con quel nome è stata definita, #ifvaluta l'espressione e verifica un valore vero

#define FOO 1
#define BAR 0

#ifdef FOO
#ifdef BAR
/* this will be compiled */
#endif
#endif

#if BAR
/* this won't */
#endif

#if FOO || BAR
/* this will */
#endif

13
Questo non risponde alla domanda. La domanda chiede la differenza tra #if definede #ifdef.
Hassan Nadeem

1
Questa è la migliore spiegazione di come #if FOO e #if defined (FOO) possono comportarsi in modo diverso.
Paul Beusterien
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.