#define
डी मैक्रोज़ वैश्विक हैं कि वे सामान्य सी स्कॉइंग नियमों का पालन नहीं करते हैं। मैक्रो से पाठ प्रतिस्थापन लागू किया जाएगा (लगभग) कहीं भी मैक्रो नाम #define
के बाद प्रकट होता है। (उल्लेखनीय अपवाद हैं यदि मैक्रो नाम किसी टिप्पणी या स्ट्रिंग अक्षर का हिस्सा है।)
यदि आप हेडर फ़ाइल में मैक्रो को परिभाषित करते हैं, तो #include
की कोई भी फ़ाइल जो हेडर फ़ाइल उस मैक्रो का वारिस करेगी (चाहे वे इसे चाहते हैं या नहीं), जब तक वे स्पष्ट रूप से #undef
के साथ इसे परिभाषित नहीं करते हैं।
आपके उदाहरण में, file2.c
TEST
मैक्रो के बारे में नहीं जानता है। file1.c
से #define
को चुनना कैसे होगा? जादू से? चूंकि मैक्रोज़ स्रोत कोड पर टेक्स्ट प्रतिस्थापन करते हैं, इसलिए उत्पन्न ऑब्जेक्ट फ़ाइलों में उनका कोई प्रतिनिधित्व नहीं होता है। file2.c
इसलिए यह पता होना चाहिए कि प्रतिस्थापन नियम स्वयं ही है, और यदि आप चाहते हैं कि कई फाइलों में साझा किया जाए, तो #define
को एक सामान्य शीर्षलेख फ़ाइल में रहने की आवश्यकता है जो आपकी .c
फ़ाइलें #include
है।
आप के बारे में विशेष रूप से पूछ रहे हैं कि कैसे #ifdef
कि आप देख में पुस्तकालयों काम करते हैं, उनमें से कई की संभावना पूर्व निर्धारित मैक्रो संकलन वातावरण द्वारा प्रदान नामों के खिलाफ जाँच कर रहे हैं के कई। उदाहरण के लिए, एक सी 99 कंपाइलर __STDC_VERSION__
मैक्रो परिभाषित करता है जो भाषा संस्करण निर्दिष्ट करता है; एक माइक्रोसॉफ्ट कंपाइलर _MSC_VER
मैक्रो परिभाषित करता है। अधिकांश कंपाइलर सरल मैक्रोज़ को कमांड लाइन तर्क के रूप में परिभाषित करने की अनुमति भी देते हैं। उदाहरण के लिए, एस को अक्षम करने के लिए परिभाषित NDEBUG
के साथ file.c
संकलित करने के लिए आप gcc -DNDEBUG file1.c
के माध्यम से अपना कोड संकलित कर सकते हैं।
यह निर्भर करता है कि उन्हें कहां परिभाषित किया गया है। – Nick
'परिभाषित 'एक प्रीप्रोसेसर निर्देश है - यह संकलन समय पर सरल पाठ प्रतिस्थापन बनाता है - केवल संकलन इकाई और किसी भी' # शामिल 'डीडी फाइलें * एक' # परिभाषित 'देखेंगी। –