2009-11-11 11 views
76

Kompiluję mój program, który będzie działał na Linuksie gcc 4.4.1 C99.Różnica między #if zdefiniowanymi (WIN32) i #ifdef (WIN32)

Właśnie wprowadziłem moje #defines w celu oddzielenia kodu, który będzie skompilowany na obu systemach Windows lub Linux. Jednak mam ten błąd.

error: macro names must be identifiers. 

Za pomocą tego kodu

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

Jednak, kiedy zmienił się ten błąd został ustalony:

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

Właśnie się zastanawiałem, dlaczego mam tego błędu i dlaczego #defines są różne?

Dziękujemy,

Odpowiedz

112

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

Różnica między nimi jest, że #ifdef może korzystać tylko jeden warunek,
podczas #if defined(NAME) może zrobić złożone warunkowe.

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 
+2

tak, ale możesz również kaskadować #ifdef UNIX z #ifndef WIN32 i uzyskać tę samą elastyczność (nie tak czytelną, zgadzam się) – jpinto3912

+1

@ jpinto3912 Ale to staje się jeszcze bardziej owłosione z '||' – Aidiakapi

+0

Gdyby tylko mieli odszedł z '#if defined (NAME)' od początku i uniknął tworzenia instrukcji '# ifdef'. – Andy

21

#ifdef sprawdza, czy makro o tej nazwie został zdefiniowany, #if oblicza wyrażenie i sprawdza dla prawdziwej wartości

#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 
+0

Nie wiem, dlaczego dostałem 2 niewyjaśnione downvotes – artm

+1

To nie odpowiada na pytanie. Pytanie wymaga różnicy między '#if defined' i' # ifdef'. –

32
#ifdef FOO 

i

#if defined(FOO) 

są takie same,

jednak zrobić kilka rzeczy naraz, można użyć zdefiniowane, jak

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

Spróbuj wymienić #elif z #else, ponieważ myślę #elif towarzyszy tylko #if a nie #ifdef .

+1

powiadomiony, to nie jest prawda – IceFire