2012-02-08 18 views
25

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

उदाहरण:

#define SomeMacro(a) 

SomeMacro("hello"); // This line doesn't add any instructions, does it? 

उत्तर

32

आप बिल्कुल सही हैं, खाली मैक्रो कोई कोड उत्पन्न नहीं करता है।

मैंने दो स्थानों को देखा है जहां यह उपयोगी है। पहले जब एक समारोह पैरामीटर नहीं किया जाता है चेतावनी खत्म करने के लिए है:

#define UNUSED(x) 

int foo(int UNUSED(value)) 
{ 
    return 42; 
} 

पीछे नहीं है जब आप यह निर्धारित करने अगर वहाँ कोड या नहीं होना चाहिए सशर्त, का उपयोग करें।

#ifdef LOGGING_ENABLED 
#define LOG(x) log_message(x) 
#else 
#define LOG(x) 
#endif 
+0

यह बहुत उपयोगी जवाब है मुझे लगता है कि अच्छी नौकरी ;) – GameDeveloper

+0

हाय मैं अपने पहले कोड समझ में नहीं आता [यहाँ मैं करने की कोशिश की] (http://codepad.org/WbSlIXkc) .. मुझे लगता है कि 'लिखने के लिए अपनी बस एक त्रुटि पूर्णांक foo (int अप्रयुक्त (मान))' यदि मैक्रो परिभाषा balank ** है ** ** –

+3

@ ग्रिशेश चौहान, आपने सी और सी ++ के बीच अंतरों में से एक को अभी खोजा है। यहाँ देखें: http://codepad.org/flX8m3sk –

5

पूर्वप्रक्रमक सभी मैक्रो के साथ शाब्दिक प्रतिस्थापन करता है।

इसलिए, यदि आप एक "खाली" मैक्रो परिभाषित करते हैं, तो आपके कोड में पहचानकर्ता प्रत्येक स्थान को संकलक के पहले चलाने से पहले प्रीप्रोसेसर द्वारा खाली विवरण के साथ प्रतिस्थापित किया जाएगा।

तो हाँ। आपके प्रश्न में दिए गए उदाहरण के लिए कोई कोड नहीं बनाया जाएगा।

6

यह सही है। आपका कोड

; 

प्रीप्रोसेसिंग के बाद फैलता है।

नोट है कि आप अपने संकलक पूछ सकते हैं आप पूर्व प्रसंस्करण के बाद कोड दिखाने के लिए (; अपने संकलक भिन्न हो सकते हैं जीसीसी में, इस -E विकल्प है)।

+0

कोड ऐसा नहीं करता पर देखने का उपयोग कहा जाता है कुछ भी उत्पन्न करें, यहां तक ​​कि अर्ध-कॉलन भी नहीं। (जीसीसी 4.5.2 के साथ सत्यापित) – shinkou

+4

@ शिनकौ, सेमी-कोलन मैक्रो के बाहर है, इसलिए यह अंतिम कोड का हिस्सा होना चाहिए। –

13

आपका कोड पूरी तरह से सही नहीं है, मैं तुम्हें अपने मैक्रो

#define somemacro(a) {} 

कारण में रिक्त ब्रेसेस डाल करने के लिए सुझाव है कि आसान है, आप कोड और अधिक सुरक्षित हो जाएगा!

इस उदाहरण लेते हैं:

if(Value) 
    somemacro(a) 
else 
    somemacro(b) 

तो मैक्रो खाली है, अपने कोड संकलन नहीं होगा! ("अन्य" से पहले अपेक्षित प्राथमिक-अभिव्यक्ति)। वैसे भी कुछ शैली नियमों

if(Value) 
{ 
    somemacro(a) 
} 
else 
{ 
    somemacro(a) 
} 

लिखने के लिए आपको मजबूर ताकि एक समस्या नहीं होगी।

एक और विकल्प ";" का उपयोग करना है "{}" के बजाय, लेकिन उसी मामले में वह विकल्प आपको संकलन समय चेतावनियां देगा, जबकि खाली ब्रेसिज़ चेतावनी नहीं देंगे और न ही त्रुटियां!

if(value) 
    somemacro(a); 
else 
    somemacro(b); 

if(value) 
{}; 
else 
{}; 

कि संकलन नहीं कर सकते करने के लिए विस्तार होगा)

ले निम्नलिखित मामले; (अर्धविराम अभी भी बेहतर है, भले ही चेतावनी है)!

है यही कारण है कि मैक्रो बुराई कर रहे हैं

(के बाद से मैक्रो सरल पाठ प्रतिस्थापन कर रहे हैं, dumbs के नियम हमेशा मैन्युअल रूप से कोड को बदलने के लिए कोशिश करते हैं और देखो क्या होता है, वहाँ भी कर रहे हैं उपकरण है कि के लिए मैक्रो का स्थान ले लेगा होना चाहिए आप विस्तार कोड दिखा।)

फिर भी guessin अगर वहाँ एक मैक्रो कि पूरी तरह से सुरक्षित है? हाँ, यह "एनओपी"

#define somemacro(a) ((void)0) 

कि किसी भी मामले में काम करेंगे (compilers का भी स्रोत फ़ाइलों कि एनओपी के रूप में, उदाहरण के के लिए सिर्फ "assert.h"

+4

सटीक इरादा मैक्रोज़ का सबसे सही उपयोग दिखाना था। कुछ मामलों में एक खाली फ़ंक्शन मैक्रो का उपयोग अभी भी नहीं किया जा सकता है। तो आपके द्वारा पोस्ट किए जाने वाले किसी भी यादृच्छिक उपयोगकर्ता को अवगत होना चाहिए कि "((शून्य) 0 का उपयोग करना)" बेहतर विकल्प है। और वैसे भी यह एक "एनओपी" है लेकिन एनओपी नहीं है। वास्तव में कोई अतिरिक्त असेंबली उत्पन्न नहीं होती है ((शून्य) 0) जबकि एक एनओपी निर्देश अभी भी असेंबली कोड है। कोड की सुरक्षा हमेशा विचार किया जाना चाहिए। वैसे भी अंगूठे के लिए कोई कारण नहीं है। – GameDeveloper

+0

उपरोक्त क्योंकि यह एकमात्र उत्तर है जो दुरुपयोग की देखभाल करता है - हालांकि शायद जोर सीधे ((शून्य) 0 पर जाना चाहिए)। कह रही है कि यह अनावश्यक है (@Qix) लोगों के लिए, जाँच [बहुत जीसीसी मैनुअल] (https://gcc.gnu.org/onlinedocs/cpp/Macro-Pitfalls.html#Macro-Pitfalls)। – hmijail

+1

उम ... यह वही है जो '{{} जबकि (0)' idiom के लिए है। उस उद्देश्य के लिए सादा '{}' का उपयोग करना एक अच्छा विचार नहीं है क्योंकि उपयोगकर्ता को उस मैक्रो आमंत्रण के बाद ';' नहीं डालने की आवश्यकता होती है। – AnT

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