2010-09-22 12 views
23

इस कोड जीसीसी संस्करण 4.3.2 (Debian 4.3.2-1.1)सी में "यूनिक्स" प्रतिबंधित कीवर्ड है?

main(){ 
    int unix; 
} 

मैं सी कीवर्ड सूची देख लिया है और "यूनिक्स" उनमें से एक नहीं है पर मेरे लिए संकलन नहीं है। मुझे निम्न त्रुटि क्यों मिल रही है?

unix.c:2: error: expected identifier or ‘(’ before numeric constant 

कोई भी?

उत्तर

24

unix मानक द्वारा आरक्षित पहचानकर्ता नहीं है।

यदि आप -std=c89 या -std=c99 के साथ संकलित करते हैं तो जीसीसी कंपाइलर आपके द्वारा अपेक्षित कार्यक्रम को स्वीकार करेगा।

जीसीसी मैनुअल (https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html) से, मेरा जोर है।

... हालांकि, ऐतिहासिक प्रणाली विशेष मैक्रो कोई विशेष उपसर्ग के साथ नाम पड़ा है; उदाहरण के लिए , यूनिक्स सिस्टम पर यूनिक्स को परिभाषित करना सामान्य है। सभी ऐसे मैक्रोज़ के लिए, जीसीसी एक समांतर मैक्रो प्रदान करता है जिसमें दो अंडरस्कोर पर शुरुआत और अंत में जोड़े गए हैं। यदि यूनिक्स परिभाषित है, तो __unix__ भी परिभाषित किया जाएगा। कभी भी अंडरस्कोर से अधिक नहीं होगा; _mips के समानांतर __mips__ है।

2

मैं इस पर जंगली स्टैब लेता हूं और अनुमान लगाता हूं कि जीसीसी प्रभावी रूप से # यूनिक्स सिस्टम पर यूनिक्स को 1 के रूप में परिभाषित करता है।

main(){ 
    printf("%d", unix); 
} 

कोशिश करते हैं और आप क्या मिलता है देखते हैं।

+0

हा! आप सही हैं: http://codepad.org/ML9VEsOa बेवकूफ जीसीसी। –

+1

@ स्टेव: यह देखने के लिए पीएमजी का जवाब देखें कि क्यों गैर-मानक मोड में 'gcc' इस मैक्रो को परिभाषित करता है। –

2

आपके प्रश्न का उत्तर करने के लिए, कोई unix सी

में एक आरक्षित शब्द हालांकि, प्रतीक unix सबसे अधिक संभावना पूर्वप्रक्रमक द्वारा परिभाषित किया गया है नहीं है क्योंकि या तो आप एक हेडर फाइल को शामिल करने या संकलक में परिभाषित करता है क्योंकि।

+0

यह जीसीसी है जो यह करता है। –

+0

यह ध्यान दिया जाना चाहिए कि यह ** टूटा ** और जीसीसी के लिए गैर-अनुरूप व्यवहार है। –

11

पता लगाने के लिए क्या संकलक वास्तव में देख रही है पूर्वप्रक्रमक के माध्यम से अपने कोड चलाएँ:

gcc -E unix.c 

तो अगर आपके चर unix संरक्षित या पूर्वप्रक्रमक द्वारा परिवर्तित किया जाता है देखते हैं।

12

यूनिक्स परिभाषित करता है पूर्वप्रक्रमक जीसीसी में उपयोग करता है पाने के लिए में से एक defs की एक सूची का उपयोग करें

gcc -dM -E -x c /dev/null 

(-dM defs -E को यह बताता है debugdump को जीसीसी बताता है prepreocessing और -xc/dev/null उसे रोकने के लिए कहता है/dev/null एसी फ़ाइल है)

+0

छोटा और आसान: 'echo | जीसीसी-ई-डीडी -' – mirabilos

6

यह कोई कीवर्ड नहीं है।

यह सिस्टम के प्रकार की पहचान करने के लिए पूर्वनिर्धारित मैक्रो है। यूनिक्स और यूनिक्स जैसे सिस्टम पर इसे 1 माना जाता है।

अक्षम करने के लिए इस विकल्प का उपयोग -ansi:

सी मोड में, इस = C89 -std के बराबर है। सी ++ मोड में, यह -std = C++ 98 के बराबर है। यह जीसीसी की कुछ विशेषताओं को बंद करता है जो आईएसओ सी 9 0 (सी कोड संकलित करते समय) या मानक सी ++ (सी ++ कोड संकलित करते समय), जैसे "एएसएम" और "टाइपोफ" कीवर्ड, और पूर्वनिर्धारित मैक्रोज़ के साथ असंगत हैं। "यूनिक्स" और "वैक्स" जो आपके द्वारा उपयोग किए जा रहे सिस्टम के प्रकार की पहचान करते हैं। यह अवांछित और शायद ही कभी इस्तेमाल आईएसओ ट्रिगर सुविधा को सक्षम बनाता है। सी कंपाइलर के लिए, यह सी ++ शैली // टिप्पणियों के साथ-साथ "इनलाइन" कीवर्ड की पहचान को अक्षम करता है।