#if परिभाषित (WIN32) और #ifdef (WIN32) के बीच अंतर


116

मैं अपने प्रोग्राम को संकलित कर रहा हूं जो linux gcc 4.4.1 C99 पर चलेगा।

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

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 अलग क्यों हैं?

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

जवाबों:


161

यदि आप #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 UNIX को कैसकेड कर सकते हैं, और समान लचीलापन प्राप्त कर सकते हैं (पठनीय नहीं, मैं सहमत हूं)
jpinto3912

2
@ jpinto3912 लेकिन वह भी बालों के साथ हो जाता है||
Aidiakapi

यदि केवल वे केवल #if defined(NAME)शुरुआत से गए थे और एक #ifdefबयान बनाने से बचते थे ।
एंडी

51
#ifdef FOO

तथा

#if defined(FOO)

समान हैं,

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

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

28

#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

13
इस सवाल का जवाब नहीं है। सवाल के बीच अंतर के लिए पूछता है #if definedऔर #ifdef
हसन नदीम

1
यह इस बात का सबसे अच्छा विवरण है कि कैसे #if FOO और #if परिभाषित (FOO) अलग-अलग व्यवहार कर सकते हैं।
पॉल बेस्टरियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.