2011-05-27 15 views
7

संभव डुप्लिकेट:
C preprocessor: using #if inside #define?प्रीप्रोसेसर निर्देश?

वहाँ परिभाषित के आरएचएस अंदर पूर्वप्रक्रमक निर्देशों के लिए किसी भी चाल है? समस्या यह है कि प्रीप्रोसेसर सभी आरएएस को एक लंबी लाइन में जोड़ता है। लेकिन शायद एक चाल है?

मैं क्या आरएचएस में चाहते हैं का उदाहरण

#define MY_CHECK \ 
    #ifndef MY_DEF \ 
    # error MY_DEF not defined \ 
    #endif 

है?
उद्देश्य एक शॉर्टनेस है: चेक के मल्टीलाइन अनुक्रम के बजाय 1-लाइन शॉर्टकट होना।

उत्तर

9

जैसा कि अन्य ने नोट किया है, प्रीप्रोसेसर मैक्रोज़ किसी अन्य प्रीप्रोसेसर निर्देशों में विस्तार नहीं कर सकता है; यदि वे करते हैं तो आपको आम तौर पर इनपुट में भटकने वाले # # 'वर्णों के बारे में अजीब त्रुटियां मिलेंगी। हालांकि, कभी-कभी ऐसी चीज़ें होती हैं जो आप प्राप्त करने के लिए कर सकते हैं। आप एक ऐसा मैक्रो की तरह कुछ के लिए विस्तारित करना चाहते हैं:

#ifdef SOMETHING 
#define IFDEF_SOMETHING(X) X 
#else 
#define IFDEF_SOMETHING(X) 
#endif 

और उसके बाद में IFDEF_SOMETHING(...some code...) का उपयोग करें:

#ifdef SOMETHING 
...some code... 
#endif 

जहां कुछ कोड किसी भी पूर्वप्रक्रमक निर्देशों को शामिल नहीं करता है, तो आप एक ifdef मैक्रो निर्धारित कर सकते हैं आपका दूसरा मैक्रो

आप पूर्वप्रक्रमक cruft के एक गुच्छा है कि आप कई बार दोहराना चाहते है, तो आप अपने आप ही फाइल में यह छड़ी कर सकते हैं और उसके बाद प्रत्येक स्थान आपको इसकी आवश्यकता में #include "stuff" का उपयोग करें।

+0

... _some code_ के पास कोई भी कॉमा नहीं था। –

+0

@ जॉन: हाँ, हालांकि C99 के साथ '...'/'__VA_ARGS__' का उपयोग अलग ज फ़ाइल में पूर्वप्रक्रमक निर्देशों की है कि समस्या –

+0

डाल अनुक्रम से बचने के लिए कर सकते हैं और सहित यह अच्छा विचार है। – Andrei

2

GNU C Preprocessor जैसे प्रीप्रोसेसर मानते हैं, तो नहीं। The manual says:

संकलक पूर्वप्रक्रमक के उत्पादन नहीं करता है फिर से tokenize। प्रत्येक प्रीप्रोकैसिंग टोकन एक कंपाइलर टोकन बन जाता है।

4

यह काम नहीं करेगा (§6.10.3.4/3: "पूरी तरह से वृहद प्रतिस्थापित टोकन अनुक्रम preprocessing एक पूर्व प्रसंस्करण के निर्देश के रूप में संसाधित नहीं है परिणामस्वरूप, भले ही वह एक जैसा दिखता है ...")।

यदि आप वास्तव में इस तरह की चीजें करना चाहते हैं, तो आप संकलन से पहले एम 4 जैसे कुछ के माध्यम से अपना स्रोत चला सकते हैं - लेकिन मैं आमतौर पर इसके खिलाफ अनुशंसा करता हूं।

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