जब एक मैक्रो का विस्तार, पूर्वप्रक्रमक मैक्रो के तर्कों का विस्तार केवल तभी जब उन तर्कों stringizing (#
) या टोकन-पेस्ट (##
) ऑपरेटरों के अधीन नहीं हैं। तो, अगर आप इस राशि:
#define stringify(x) #x
stringify(__LINE__)
फिर, पूर्वप्रक्रमक नहीं विस्तार __LINE__
करता है, क्योंकि यह stringizing ऑपरेटर का तर्क है। हालांकि, जब आप यह करते हैं:
#define stringify1(x) #x
#define stringify(x) stringify1(x)
stringify(__LINE__)
तब, जब stringify
का विस्तार, पूर्वप्रक्रमक वर्तमान पंक्ति संख्या के लिए __LINE__
फैलता है, के बाद से x
stringify
की परिभाषा में या तो stringizing या टोकन-पेस्ट ऑपरेटरों के साथ किया जाता है। इसके बाद यह stringify1
फैलाता है, और हम जो चाहते थे उसे प्राप्त करते हैं।
C99 मानक से प्रासंगिक भाषा से §6.10.3.1/1 आता है:
एक समारोह की तरह मैक्रो के आह्वान के लिए बहस के बाद पहचान की गई है, तर्क प्रतिस्थापन जगह लेता है। प्रतिस्थापन सूची में एक पैरामीटर, जब तक कि #
या ##
प्रीप्रोकैसिंग टोकन से पहले या ##
प्रीप्रोकैसिंग टोकन (नीचे देखें) से पहले, उसमें निहित सभी मैक्रोज़ का विस्तार करने के बाद संबंधित तर्क द्वारा प्रतिस्थापित किया गया है। प्रतिस्थापित होने से पहले, प्रत्येक तर्क के प्रीप्रोकैसिंग टोकन पूरी तरह मैक्रो प्रतिस्थापित होते हैं जैसे कि उन्होंने शेष प्रीप्रोकैसिंग फ़ाइल बनाई है; कोई अन्य प्रीप्रोकैसिंग टोकन उपलब्ध नहीं हैं।
क्लाज §6.10.3.2 और 6.10.3.3 क्रमशः #
और ##
ऑपरेटरों के व्यवहार को परिभाषित करने पर चलते हैं।
स्रोत
2011-07-19 05:24:15
[जीसीसी सी प्रीप्रोसेसर दस्तावेज] (http://gcc.gnu.org/onlinedocs/cpp/) देखें। आपको [स्ट्रिंगफिकेशन] (http://gcc.gnu.org/onlinedocs/cpp/Stringification.html#Stringification) पर अनुभाग में विशेष रुचि होगी। – ughoavgfhw
संभावित डुप्लिकेट [मैक्रोज़ के बीच क्या अंतर है "# परिभाषित एसटीआर (एक्स) #x" और "# परिभाषित करें एसटीआर (एक्स) वीएएल (एक्स)" # परिभाषित करें VAL (x) #x "? (Http: //stackoverflow.com/questions/8283596/whats-the-difference-between-the-macros-define-strx-x-and-define-strx) –