पुराने दिनों (पूर्व-एएनएसआई) में, जैसे प्रतीकों को पूर्वनिर्धारित करना unix
और vax
संकलन समय पर कोड का पता लगाने की अनुमति देने का एक तरीका था कि किस प्रणाली के लिए इसे संकलित किया जा रहा था। तब कोई आधिकारिक भाषा मानक वापस नहीं थी (के एंड आर के पहले संस्करण के संदर्भ सामग्री से परे), और किसी भी जटिलता का सी कोड आमतौर पर #ifdef
सिस्टम के बीच अंतर की अनुमति देने के लिए एस का एक जटिल भूलभुलैया था । इन मैक्रो परिभाषाओं को आमतौर पर कंपाइलर द्वारा ही निर्धारित किया गया था, लाइब्रेरी हेडर फ़ाइल में परिभाषित नहीं किया गया था। चूंकि कोई वास्तविक नियम नहीं थे जिसके बारे में कार्यान्वयन द्वारा पहचानकर्ताओं का उपयोग किया जा सकता था और जो प्रोग्रामर के लिए आरक्षित थे, कंपाइलर लेखकों ने सरल नामों का उपयोग करने के लिए स्वतंत्र महसूस किया unix
और यह मान लिया कि प्रोग्रामर बस उन नामों को अपने स्वयं के प्रयोजनों के लिए उपयोग करने से बचेंगे।
1989 के एएनएसआई सी मानक ने नियमों को लागू करने से प्रतिबंधित कर दिया था जो एक कार्यान्वयन को कानूनी रूप से पूर्वनिर्धारित कर सकते थे। संकलक द्वारा पूर्वनिर्धारित एक मैक्रो में केवल दो अंडरस्कोर से शुरू होने वाला नाम हो सकता है, या एक अपरकेस के साथ एक अपरकेस अक्षर हो सकता है, जो प्रोग्रामर को उस पैटर्न से मेल नहीं खाने वाले पहचानकर्ताओं का उपयोग करने के लिए स्वतंत्र छोड़ देता है और मानक पुस्तकालय में उपयोग नहीं किया जाता है।
नतीजतन, कोई भी कंपाइलर जो पूर्वनिर्धारित unix
या linux
गैर-अनुरूप है, क्योंकि यह पूरी तरह से कानूनी कोड को संकलित करने में विफल होगा जो कुछ का उपयोग करता है int linux = 5;
।
जैसा कि होता है, जीसीसी डिफ़ॉल्ट रूप से गैर-अनुरूपता है - लेकिन इसे सही कमांड-लाइन विकल्पों के साथ (उचित रूप से अच्छी तरह) अनुरूप बनाया जा सकता है:
gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic
देखें जीसीसी पुस्तिका अधिक जानकारी के लिए।
gcc भविष्य की रिलीज़ में इन परिभाषाओं को चरणबद्ध करेगा, इसलिए आपको ऐसा कोड नहीं लिखना चाहिए जो उन पर निर्भर करता है। यदि आपके कार्यक्रम को यह जानना आवश्यक है कि क्या यह लिनक्स लक्ष्य के लिए संकलित किया जा रहा है या नहीं, तो यह __linux__
परिभाषित किया जा सकता है कि क्या यह परिभाषित है (आप gcc का उपयोग कर रहे हैं या एक कंपाइलर जो इसके अनुकूल है)। देखें GNU सी पूर्वप्रक्रमक पुस्तिका अधिक जानकारी के लिए।
एक हद तक अप्रासंगिक: डेविड कॉर्न ( 1987 में , डेविड कॉर्न के लेखक ने हाँ) का "बेस्ट वन लाइनर" विजेता अंतर्राष्ट्रीय सी कोड प्रतियोगिता को पुरस्कृत unix
मैक्रो का लाभ उठाया :
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
यह प्रिंट करता है "unix"
, लेकिन उन कारणों के लिए जिनका मैक्रो नाम की वर्तनी से कोई लेना-देना नहीं है।