2011-01-24 19 views
29

डीबगबिल्ड के लिए, मैं आमतौर पर क्लैंग का उपयोग करता हूं, क्योंकि यह चेतावनियों और त्रुटियों को बेहतर बनाता है, और उन्हें ट्रैक करने के लिए थोड़ा आसान बनाता है, और उन्हें ठीक करता है।वैराडिक मैक्रोज़ गैर मानक हैं?

लेकिन हाल ही में variadic तर्क के साथ एक मैक्रो को जोड़ने के बाद, बजना मुझे बताया (एक डमी परियोजना से) के बाद:

main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros] 
#define stuff3(args...) stuff_i(args) 

मुझे पता है कि macroname(args...) compilers की एक विस्तृत श्रृंखला, VisualStudio, Sunstudio सहित ठीक संकलित , और निश्चित रूप से जीसीसी।

संख्या 1:

#define stuff1(...) stuff_i(...) 

संख्या 2: लेकिन सिर्फ यकीन है कि बजना सही है बनाने के लिए, मैं variadic तर्क के विस्तार की दो अन्य तरीकों की कोशिश की

#define stuff2(...) stuff_i(__VA_ARGS__) 

दोनों पर मैं इस प्राप्त संदेश:

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros] 

... जो मुझे आश्चर्यचकित करता है कि क्या वैराडिक मैक्रोज़ वास्तव में सी ++ के मानक का हिस्सा हैं (ए निश्चित रूप से मुझे पता है कि प्रीप्रोसेसर का स्वतंत्र रूप से व्याख्या किया जाता है)?

+1

C99 और C++ 0x आधिकारिक तौर पर संस्करण 2 सी ++ 03 का समर्थन किसी भी variadic मैक्रो का समर्थन नहीं करता:

यहाँ C++ एक मानक अनुरूप variadic मैक्रो परिभाषा का एक उदाहरण है।संस्करण 1 जीसीसी-विशिष्ट एक्सटेंशन – sellibitze

+0

(आपके नाम की तरह) है जब आप जीसीसी के साथ संकलित करते हैं तो '-pedantic' विकल्प होता है जिसे उपयोग किए गए एक्सटेंशन की रिपोर्ट करनी चाहिए। उदाहरण के लिए वैरिएबल लम्बाई ऐरे या वैराडिक मैक्रोज़ की तरह। जीसीसी में उन्हें केवल इसलिए शामिल किया जाता है क्योंकि चूंकि वे सी 99 का हिस्सा हैं, इसलिए तर्क पहले ही लागू हो चुका है, इसलिए सी ++ लोक लाभ को छोड़ना अच्छा विचार होना चाहिए :) –

+0

@ मैथ्यूयू एम: हां वास्तव में, मैंने यह भी सोचा कि यह सुविधा सी ++ का हिस्सा होगा, क्योंकि यह पहले से ही सी 99 का हिस्सा है ... दिलचस्प बात यह है कि जीसीसी यह नहीं कहता है कि नामित वैराडिक मैक्रोज़ वास्तव में एक जीएनयू एक्सटेंशन हैं, लेकिन इसके बजाय सिर्फ यह कहता है कि वे मानक का हिस्सा नहीं हैं: 'चेतावनी: आईएसओ सी नामित वैराडिक मैक्रोज़ –

उत्तर

36

उद्धरण Wikipedia:

अस्थिर-तर्क मैक्रो आईएसओ/आईईसी 9899 में 1999 में पेश किया गया: 2011 में आईएसओ 1999 (C99) सी भाषा मानक में संशोधन, और/आईईसी 14882: 2011 (सी ++ 11) सी ++ भाषा मानक का संशोधन।

तो यह सी 99 और सी ++ 11 के बाद मानक है, लेकिन सी ++ 03 में एक जीएनयू एक्सटेंशन है।

4

आपके उदाहरण "संख्या 2" के रूप में, वे सी 99 में मानक हैं, और आम तौर पर सी ++ कंपाइलर का प्रीप्रोसेसर सी और सी ++ संकलन के लिए समान होता है।

सी 99 अनुपालन के अन्यथा जिद्दी प्रतिरोध के बावजूद वे माइक्रोसॉफ्ट वीसी ++ का भी समर्थन करते हैं। तो उस और जीसीसी के बीच उनका उपयोग करने से बचने के कुछ कारण हैं। यहां तक ​​कि अधिकांश एम्बेडेड सिस्टम कंपाइलर्स पर भी मैं उनका उपयोग करता हूं।

हालांकि "नंबर 1" फ़ॉर्म से बचें, जो दृढ़ता से जीसीसी विशिष्ट है, और इसमें कोई संदेह नहीं है।

0

स्टैंडर्ड 16.3 मैक्रो प्रतिस्थापन में कहते हैं:

पहचानकर्ता _ _ VA_ARGS _ _ केवल एक समारोह की तरह मैक्रो मानकों में अंडाकार संकेतन का उपयोग करता है के प्रतिस्थापन-सूची में पाए जाते हैं जाएगा।

26

सी ++ 11 के रूप में, वैरिएडिक मैक्रोज़ अब मानक सी ++ में शामिल हैं। सी ++ 11 मानक की धारा 16.3 वैरैडिक मैक्रोज़ निर्दिष्ट करती है जैसे कि वे सी 99 (प्रश्न में दूसरा रूप) से वैरिएडिक मैक्रोज़ के साथ संगत हैं।

#define foo(x, y, ...) bar(x, y, __VA_ARGS__) 
+1

की अनुमति नहीं देता है यह मानक अनुरूप है, लेकिन यदि विकिपीडिया पर विश्वास किया जाता है, तो यह कॉमा बग से भी पीड़ित है। –

+0

@AlexeiAverchenko: मैंने जीसीसी दस्तावेज में देखा है कि यदि कुछ भी नहीं रखा गया है तो अल्पविराम हटा दिया जाएगा ... हालांकि आज मैं कुछ कोड को क्लैंग करने के लिए पोर्ट करता हूं और मुझे 'अपेक्षित अभिव्यक्ति' त्रुटि मिल रही है और मैं अभी तक नहीं हूं इसे समझना संबंधित हो सकता है –

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