#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.