2011-07-19 15 views
8

यह अपेक्षा के अनुरूप काम नहीं करता है:मैक्रो विस्तार का सही कदम क्या है?

#define stringify(x) #x 
printf("Error at line " stringify(__LINE__)); 

यह काम करता है:

#define stringify1(x) #x 
#define stringify(x) stringify1(x) 
printf("Error at line " stringify(__LINE__)); 

प्राथमिकता है कि इस तरह के preprocess मैक्रो विस्तार करने के लिए उपयोग करता क्या है?

+0

[जीसीसी सी प्रीप्रोसेसर दस्तावेज] (http://gcc.gnu.org/onlinedocs/cpp/) देखें। आपको [स्ट्रिंगफिकेशन] (http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification) पर अनुभाग में विशेष रुचि होगी। – ughoavgfhw

+0

संभावित डुप्लिकेट [मैक्रोज़ के बीच क्या अंतर है "# परिभाषित एसटीआर (एक्स) #x" और "# परिभाषित करें एसटीआर (एक्स) वीएएल (एक्स)" # परिभाषित करें VAL (x) #x "? (Http: //stackoverflow.com/questions/8283596/whats-the-difference-between-the-macros-define-strx-x-and-define-strx) –

उत्तर

13

जब एक मैक्रो का विस्तार, पूर्वप्रक्रमक मैक्रो के तर्कों का विस्तार केवल तभी जब उन तर्कों stringizing (#) या टोकन-पेस्ट (##) ऑपरेटरों के अधीन नहीं हैं। तो, अगर आप इस राशि:

#define stringify(x) #x 
stringify(__LINE__) 

फिर, पूर्वप्रक्रमक नहीं विस्तार __LINE__ करता है, क्योंकि यह stringizing ऑपरेटर का तर्क है। हालांकि, जब आप यह करते हैं:

#define stringify1(x) #x 
#define stringify(x) stringify1(x) 
stringify(__LINE__) 

तब, जब stringify का विस्तार, पूर्वप्रक्रमक वर्तमान पंक्ति संख्या के लिए __LINE__ फैलता है, के बाद से xstringify की परिभाषा में या तो stringizing या टोकन-पेस्ट ऑपरेटरों के साथ किया जाता है। इसके बाद यह stringify1 फैलाता है, और हम जो चाहते थे उसे प्राप्त करते हैं।

C99 मानक से प्रासंगिक भाषा से §6.10.3.1/1 आता है:

एक समारोह की तरह मैक्रो के आह्वान के लिए बहस के बाद पहचान की गई है, तर्क प्रतिस्थापन जगह लेता है। प्रतिस्थापन सूची में एक पैरामीटर, जब तक कि # या ## प्रीप्रोकैसिंग टोकन से पहले या ## प्रीप्रोकैसिंग टोकन (नीचे देखें) से पहले, उसमें निहित सभी मैक्रोज़ का विस्तार करने के बाद संबंधित तर्क द्वारा प्रतिस्थापित किया गया है। प्रतिस्थापित होने से पहले, प्रत्येक तर्क के प्रीप्रोकैसिंग टोकन पूरी तरह मैक्रो प्रतिस्थापित होते हैं जैसे कि उन्होंने शेष प्रीप्रोकैसिंग फ़ाइल बनाई है; कोई अन्य प्रीप्रोकैसिंग टोकन उपलब्ध नहीं हैं।

क्लाज §6.10.3.2 और 6.10.3.3 क्रमशः # और ## ऑपरेटरों के व्यवहार को परिभाषित करने पर चलते हैं।

+0

'#' और '##' विशेष रूप से इलाज के लिए तर्क क्या है ? –

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