różnica między #if zdefiniowanym (WIN32) a #ifdef (WIN32)

116

Kompiluję program, który będzie działał na linuxie gcc 4.4.1 C99.

Właśnie wstawiałem moje #defines, aby oddzielić kod, który zostanie skompilowany w systemie Windows lub Linux. Jednak dostałem ten błąd.

error: macro names must be identifiers.

Używając tego kodu

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

Jednak gdy przesiadłem się na ten błąd został naprawiony:

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

Zastanawiałem się tylko, dlaczego otrzymałem ten błąd i dlaczego #defines są różne?

Wielkie dzięki,

ant2009
źródło

Odpowiedzi:

161

Jeśli używasz składni #ifdef, usuń nawiasy.

Różnica między nimi polega na tym, że #ifdefmożna używać tylko jednego warunku,
podczas gdy #if defined(NAME)można używać złożonych warunków.

Na przykład w Twoim przypadku:

#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
user44556
źródło
2
tak, ale możesz również kaskadować #ifdef UNIX z #ifndef WIN32 i uzyskać taką samą elastyczność (nie tak czytelną, zgadzam się)
jpinto3912
2
@ jpinto3912 Ale to staje się jeszcze bardziej owłosione z||
Aidiakapi
Gdyby tylko odeszli #if defined(NAME)od samego początku i uniknęli tworzenia #ifdefoświadczenia.
Andy,
52
#ifdef FOO

i

#if defined(FOO)

są takie same,

ale aby zrobić kilka rzeczy naraz, możesz użyć zdefiniowanych, takich jak

#if defined(FOO) || defined(BAR)
neha
źródło
28

#ifdefsprawdza, czy zostało zdefiniowane makro o tej nazwie, #ifocenia wyrażenie i sprawdza, czy jest to prawda

#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
johannes
źródło
13
To nie odpowiada na pytanie. Pytanie dotyczy różnicy między #if defineda #ifdef.
Hassan Nadeem
1
To jest najlepsze wyjaśnienie, w jaki sposób #if FOO i #if zdefiniowane (FOO) mogą zachowywać się inaczej.
Paul Beusterien