2012-11-04 14 views
25

नहीं देता है, मैं एक्स मैक्रो लागू कर रहा हूं, लेकिन मुझे एक साधारण मैक्रो विस्तार के साथ समस्या है। this आलेख सहित, इस मैक्रो (नीचे देखें) कई मैक्रोज़ उपयोग उदाहरणों में उपयोग किया जाता है। कंपाइलर एक त्रुटि संदेश देता है, लेकिन मैं जीसीसी कंपाइलर के साथ -E ध्वज का उपयोग कर वैध सी कोड देख सकता हूं।त्रुटि: पेस्टिंग "।" और "लाल" वैध प्रीप्रोकैसिंग टोकन

मैक्रो एक्स-सूची के रूप में परिभाषित किया गया है निम्नलिखित:

#define LIST \ 
    X(red, "red") \ 
    X(blue, "blue") \ 
    X(yellow, "yellow") 

और फिर:

#define X(a, b) foo.##a = -1; 
    LIST; 
#undef X 

लेकिन जीसीसी दिया निम्न त्रुटियों संदेशों:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 
मैं जैसा

ने कहा, मैं -E का उपयोग कर वैध सी कोड देख सकता हूं जीसीसी पर स्विच:

lixo.c:42:1: error: pasting "." and "red" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "blue" does not give a valid preprocessing token 
lixo.c:42:1: error: pasting "." and "yellow" does not give a valid preprocessing token 
    foo.red = -1; foo.blue = -1; foo.yellow = -1;; 

वैध प्रीप्रोकैसिंग टोकन क्या है? क्या कोई इसे समझा सकता है?

(इससे पहले कि आप कहते हैं कि "क्यों नहीं सिर्फ एक या तो प्रारंभ या memset()?" यह मेरा असली कोड नहीं है।)

उत्तर

36

. टोकन अलग करती है और इसलिए आप उपयोग नहीं कर सकते ##.red के रूप में एक वैध टोकन नहीं है। यदि आप दो टोकन को एक-दूसरे में जोड़ रहे थे तो आप केवल ## का उपयोग करेंगे।

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

#define X(a, b) foo.a = -1; 

What's a valid proprocessing token? Can someone explain this?

यह क्या पार्स/lexed हो जाता है। यदि आप ## का उपयोग आप केवल 2 टोकन (एक पहचानकर्ता और एक अमान्य टोकन) मिलेगा foo . bar: foo .bar

+0

धन्यवाद बहुत बहुत foo.bar 3 टोकन (दो पहचानकर्ता और एक ऑपरेटर) के रूप में पार्स किया जाएगा। – Jack

+5

तो इस आलेख में "पेस्टिंग टोकन" अनुभाग है (http://www.cprogramming.com/tutorial/cpreprocessor.html) बस गलत है? – Michael

+5

@ माइकल हाँ, यह गलत है। –