2009-11-11 16 views
76

के बीच अंतर मैं अपने प्रोग्राम को संकलित कर रहा हूं जो लिनक्स जीसीसी 4.4.1 सी 99 पर चल रहा है।#if परिभाषित (WIN32) और #ifdef (WIN32)

मैं सिर्फ # डिफाईन्स को उस कोड को अलग करने के लिए डाल रहा था जिसे विंडोज या लिनक्स पर संकलित किया जाएगा। हालांकि, मुझे यह त्रुटि मिली।

error: macro names must be identifiers. 

इस कोड

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

हालांकि, जब मैं इस के लिए बदल त्रुटि तय किया गया था का उपयोग करना:

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

मैं बस सोच रहा था क्यों मुझे लगता है कि त्रुटि मिली और क्यों #defines अलग है?

बहुत धन्यवाद,

उत्तर

112

आप #ifdef सिंटैक्स का उपयोग करते हैं, तो कोष्ठक हटा दें।

दोनों के बीच अंतर यह है कि #ifdef केवल एक ही हालत,
उपयोग कर सकते हैं, जबकि #if defined(NAME) यौगिक सशर्त, कर सकते हैं।

अपने मामले में उदाहरण के लिए:

#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

हाँ, लेकिन आप यह भी #ifndef WIN32 साथ यूनिक्स #ifdef कैस्केड, और एक ही लचीलापन मिल सकता है (के रूप में पढ़ा नहीं जा सकता, मैं मानता हूँ) – jpinto3912

+1

@ jpinto3912 लेकिन अगर केवल वे सिर्फ था कि यहां तक ​​कि के साथ '' || – Aidiakapi

+0

hairier हो जाता है शुरुआत से '#if परिभाषित (NAME)' के साथ चला गया और '# ifdef' कथन बनाने से बचा। – Andy

21

#ifdef जाँच करता है कि उस नाम से एक मैक्रो परिभाषित किया गया है, #if एक सच्चे मूल्य के लिए अभिव्यक्ति और चेक का मूल्यांकन करता है

#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

यह सुनिश्चित नहीं है कि इसे 2 अस्पष्ट डाउनवॉट क्यों मिला – artm

+1

यह प्रश्न का उत्तर नहीं देता है। सवाल '#if परिभाषित' और' # ifdef' के बीच अंतर के लिए पूछता है। –

32
#ifdef FOO 

और

#if defined(FOO) 
के बाद से मुझे लगता है कि #elif केवल #ifdef साथ नहीं #if के साथ साथ और है 210

, एक ही हैं

एक बार में कई काम करने के लिए, आप परिभाषित उपयोग कर सकते हैं लेकिन,

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

तरह #else साथ #elif के बजाय ऐसे, ।

+1

अधिसूचित, यह सच नहीं है – IceFire