2010-03-06 19 views
7

मैं पूर्व प्रोसेसर का उपयोग एक लाइन टिप्पणी करना चाहते हैं:प्री-प्रोसेसर क्यों एक जगह देता है?

#define open /##* 

#define close */ 

main() 
{ 
     open commented line close 
} 

जब मैं $gcc -E filename.c मैं उम्मीद

/* commented line */ 

है, लेकिन मैं

/ * commented line */ 

ताकि संकलक एक से पता चलता मिला त्रुटि

यह एक अवांछित स्पा क्यों दे रहा है ऐस?

+4

शायद तुम "abusing_the_c_preprocessor" टैग को जोड़ने चाहिए उपयोग करना चाहते हैं? ;) – Johan

उत्तर

3

प्रीप्रोसेसर एक ऐसे रूप में कोड चलाता है और बनाता है जो सी कंपाइलर समझ सकता है। यह केवल आपके कोड को एक बार संसाधित करता है, इसलिए यदि आप का उत्पादन #define के साथ कर सकते हैं, तो कंपाइलर /* देखेगा और आपको एक त्रुटि देगा क्योंकि यह वैध सी कोड नहीं है (यह एक प्रीप्रोसेसिंग निर्देश है)।

ऐसा करने के लिए यह बहुत अच्छी बात नहीं लगती है।

+0

'# परिभाषित 'यहां एकमात्र प्रीप्रोसेसिंग निर्देश है। '/ *' प्रीप्रोसेसर निर्देश नहीं है, लेकिन यह स्पष्ट नहीं है कि आप किस चीज का जिक्र कर रहे हैं। – Potatoswatter

+1

@Potatoswatter: प्रीप्रोसेसर संकलक को कोड पास करने से पहले टिप्पणियों को हटाने के लिए ज़िम्मेदार है। –

+2

सी 99 5.1.1.2/3 के अनुसार, टिप्पणियां व्हाइटस्पेस हैं और टोकन प्रीप्रोसेसिंग नहीं कर रही हैं। – Potatoswatter

3

क्योंकि प्रीप्रोसेसर रन से पहले (और केवल पहले) टिप्पणियों के साथ टिप्पणियों को प्रतिस्थापित किया जाता है। यदि आप preprocessor का उपयोग कर / और * वर्णों को एक साथ पेस्ट करते हैं, तो आपको /* मिलता है जो कि केवल कुछ ऑपरेटरों है। संपादित करें:## का दुरुपयोग तकनीकी रूप से /* को एक टोकन के रूप में बनाता है, जिसने व्यवहार को अपरिभाषित किया है। आप > ## > या < %:%: : को एक साथ पेस्ट कर सकते हैं, हालांकि आपको नहीं करना चाहिए।

सी 99 के §6.4.6 देखें कि किस टोकन को बनाने की अनुमति है और कैटेनेशन प्रक्रिया के लिए 6.10.3.3।

6

GNU सी प्रीप्रोसेसर प्रलेखन से:

हालांकि, दो टोकन है कि एक साथ एक मान्य टोकन फार्म नहीं है एक साथ चिपकाया नहीं जा सकता। उदाहरण के लिए, आप किसी भी क्रम में + के साथ x को संयोजित नहीं कर सकते हैं। यदि आप कोशिश करते हैं, तो प्रीप्रोसेसर एक चेतावनी जारी करता है और दो टोकन उत्सर्जित करता है। चाहे यह टोकन के बीच सफेद जगह रखता है, अनिर्धारित है। जटिल मैक्रोज़ में '##' के अनावश्यक उपयोगों को ढूंढना आम बात है। अगर आपको यह चेतावनी मिलती है, तो संभवतः आप '##' को हटा सकते हैं।

इस मामले में '*' और '/' वैध सी या सी ++ टोकन नहीं बनाते हैं। तो वे उनके बीच एक जगह के साथ उत्सर्जित कर रहे हैं।

:

5

(एक तरफ। आप सी संकलन त्रुटियों मिलने की संभावना है, भले ही आप सी पूर्वप्रक्रमक के उत्पादन में "टिप्पणी" डालने के लिए प्रबंधन कैसे करूँ वहाँ वहाँ कोई टिप्पणी होना चाहिए नहीं कर रहे हैं।) त्रुटि इसलिए है क्योंकि /* मान्य टोकन नहीं है।

रूप CPP doc से समझाया:

दो टोकन है कि एक साथ एक मान्य टोकन फार्म नहीं है एक साथ चिपकाया नहीं जा सकता। उदाहरण के लिए, आप किसी भी क्रम में + के साथ x को संयोजित नहीं कर सकते हैं।

आप अन्य बकवास सामान चिपकाकर त्रुटि प्राप्त कर सकते हैं उदा। /##+ या +##-


अंतरिक्ष के बारे में है, यह जान-बूझकर एक टिप्पणी और गंदगी बाकी बनाने से बचने के लिए डाला जाता है। से GCC source code:

/* Avoid comment headers, since they are still processed in stage 3. 
     It is simpler to insert a space here, rather than modifying the 
     lexer to ignore comments in some circumstances. Simply returning 
     false doesn't work, since we want to clear the PASTE_LEFT flag. */ 
     if ((*plhs)->type == CPP_DIV && rhs->type != CPP_EQ) 
     *end++ = ' '; 
0

आप, कुछ पूर्व प्रोसेसर का उपयोग कोड टिप्पणी करने के लिए

#if 0 
... 
#endif 
संबंधित मुद्दे