2008-12-15 12 views
36

क्या सी-स्टाइल मैक्रो नाम पहचानकर्ताओं के समान नामकरण नियमों के अधीन हैं? एक संकलक अपग्रेड करने के बाद, यह अब एक विरासत आवेदन के लिए यह चेतावनी उत्सर्जित करती है:मैक्रो नामों के लिए मान्य वर्ण क्या हैं?

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text 
    #define   CHAR_&  38 

कोड की यह पंक्ति एक ASCII मूल्य एक ampersand के लिए निरंतर परिभाषित करने है।

#define DOL_SN  36 
#define PERCENT  37 
#define CHAR_&  38 
#define RT_SING  39 
#define LF_PAR  40 

मुझे लगता है कि इस परिभाषा (वास्तव में, किसी भी कोड द्वारा संदर्भित नहीं जहाँ तक मैं बता सकता हूँ) गाड़ी है और "CHAR_AMPERSAND" की तरह कुछ करने के लिए परिवर्तित किया जाना चाहिए?

उत्तर

32

मैक्रो नाम केवल अक्षरांकीय अक्षर और अंडरस्कोर, अर्थात 'a-z', 'A-Z', '0-9', और '_', और पहले चरित्र नहीं होना चाहिए अंक होने चाहिए। कुछ प्रीप्रोसेसरों डॉलर संकेत चिह्न '$' पर भी अनुमति देते हैं, लेकिन आपको इसका उपयोग नहीं करना चाहिए; दुर्भाग्य से मैं सी मानक उद्धृत नहीं कर सकता क्योंकि मेरे पास इसकी एक प्रति नहीं है।

GCC documentation से: पहचानकर्ता preprocessing संख्या, स्ट्रिंग शाब्दिक, punctuators, और अन्य:

Preprocessing टोकन पाँच व्यापक वर्ग में आते हैं। एक पहचानकर्ता सी में पहचानकर्ता के समान है: अक्षरों, अंकों या अंडरस्कोर के किसी भी अनुक्रम, जो किसी पत्र या अंडरस्कोर से शुरू होता है। सी के कीवर्ड प्रीप्रोसेसर के लिए कोई महत्व नहीं है; वे सामान्य पहचानकर्ता हैं। उदाहरण के लिए, आप एक मैक्रो परिभाषित कर सकते हैं जिसका नाम एक कीवर्ड है। एकमात्र पहचानकर्ता जो माना जा सकता है, प्रीप्रोसेसिंग कीवर्ड defined है। परिभाषित देखें।

यह ज्यादातर अन्य भाषाओं के बारे में सच है जो सी प्रीप्रोसेसर का उपयोग करते हैं। हालांकि, सी ++ के कुछ कीवर्ड प्रीप्रोसेसर में भी महत्वपूर्ण हैं। सी ++ नामांकित ऑपरेटर देखें।

1999 सी मानक में, पहचानकर्ता (जैसे उच्चारण के लैटिन वर्ण के रूप में, ग्रीक अक्षर, या चीनी चित्रलिपि के जरिये) पत्र जो "मूल स्रोत वर्ण सेट", कार्यान्वयन के विवेक पर का हिस्सा नहीं हैं हो सकती है । यह एक विस्तारित वर्ण सेट, या '\u' और '\U' से बच अनुक्रमों के साथ किया जा सकता है। जीसीसी में इस सुविधा का कार्यान्वयन प्रयोगात्मक है; ऐसे वर्ण केवल '\u' और '\U' रूपों में स्वीकार किए जाते हैं और केवल -fextended-identifiers का उपयोग किया जाता है।

एक विस्तार के रूप में, जीसीसी '$' पत्र के रूप में व्यवहार करता है। यह के साथ संगतता के लिए है, जैसे कि वीएमएस, जहां '$' आमतौर पर सिस्टम-परिभाषित फ़ंक्शन और ऑब्जेक्ट नामों में उपयोग किया जाता है।'$' सख्ती से अनुरूप मोड, में एक पत्र नहीं है या यदि आप -$ विकल्प निर्दिष्ट करते हैं। आमंत्रण देखें।

+4

आईएसओ/आईईसी 98 99: टीसी 3 6.10/1 प्रीप्रोकैसिंग निर्देशों के व्याकरण को निर्दिष्ट करता है, यह स्पष्ट करता है कि मैक्रो नाम पहचानकर्ताओं के समान सटीक नियम साझा करते हैं। 6.4.2.1/1 पहचानकर्ताओं के लिए नियम निर्दिष्ट करता है। – saffsd

6

आप सही हैं, वही नियम मैक्रो और पहचानकर्ताओं के लिए लागू होते हैं जहां तक ​​नाम संबंधित हैं: मान्य वर्ण हैं [ए-ज़ा-जे 0-9_]।

अन्य पहचानकर्ताओं - चर और फ़ंक्शन नाम से मैक्रोज़ को अलग करने के लिए कैपिटल नामों का उपयोग करना आम बात है।

1

वही नियम जो परिवर्तनीय नामों के लिए मान्य पहचानकर्ता निर्दिष्ट करते हैं, अपवाद के साथ मैक्रो नामों पर लागू होते हैं कि मैक्रोज़ के पास कीवर्ड के समान नाम हो सकते हैं। पहचानकर्ता नामों में मान्य वर्णों में digits और non-digits शामिल हैं और अंक से शुरू नहीं होना चाहिए। non-digits में अपरकेस अक्षरों ए-जेड, लोअरकेस अक्षर ए-जेड, अंडरस्कोर, और किसी कार्यान्वयन परिभाषित वर्ण शामिल हैं।

+0

"अपवाद के साथ कि मैक्रोज़ के पास कीवर्ड के समान नाम हो सकते हैं" - हां, लेकिन अधिक अपवादों के साथ कि मैक्रोज़ के पास इस प्रीप्रोसेसर कीवर्ड के समान नाम नहीं हो सकता है: परिभाषित –

7

clang "पागल" वर्ण का एक बहुत की अनुमति देता है .. हालांकि मैं किसी भी ज्यादा कविता या कारण खोजने के लिए संघर्ष किया है - के रूप में क्योंकुछ अनुमति दी जाती है, और दूसरों को नहीं हैं। उदाहरण के लिए ..

#define ?:   /// WORKS FINE 
#define ■ @end  /// WORKS FINE 
#define @interface /// WORKS FINE 
#define P @protocol /// WORKS FINE 

अभी तक

#define ☎ TEL  /// ERROR: Macro name must be an identifier. 
#define ❌ NO  /// ERROR: Macro name must be an identifier. 
#define ⇧ UP  /// ERROR: Macro name must be an identifier. 
#define 〓 ==  /// ERROR: Macro name must be an identifier. 
#define APPLE /// ERROR: Macro name must be an identifier. 

कौन जानता है। मुझे पसंद है ... लेकिन Google ने अब तक मुझे असफल कर दिया है। विषय पर कोई अंतर्दृष्टि, सराहना की जाएगी ️।

+0

क्लैंग दस्तावेज़ों में एक नज़र डालें। या यदि यह दस्तावेज भी नहीं है, तो इसके ओपनसोर्स के बाद से इसके स्रोत कोड को जांचें। लेकिन सी मानक से मैं आपको बता सकता हूं कि वे सभी अमान्य हैं। और इसके लिए, क्योंकि इसके किसी भी पर्यावरण से संबंधित रिक के लिए नहीं पूछा गया है, लेकिन सादे सी के लिए। इसलिए यह एक अलग प्रश्न के रूप में एक उत्तर के रूप में और भी उपयुक्त है और शायद इसे भी इस तरह ध्वजांकित किया जाना चाहिए। ... यहां तक ​​कि एक बहुत अच्छा है। अगर आप नहीं जा रहे हैं तो मैं यह पूछूंगा। – dhein

+0

@ ज़ाइबिस चेक आउट ["वैध" सी पहचानकर्ता के रूप में क्या गठित है?] (Http://stackoverflow.com/q/34319000/547214) –

संबंधित मुद्दे