2011-03-19 13 views
11

एक वैरैडिक मैक्रो FOO(a1, a2, a3,..., an) बनाने के लिए क्या चाल है कि यह FOOn(a1, a2, a3,..., an)n के मूल्यों के लिए जो भी पूर्व निर्धारित सीमाबद्ध सीमा में विस्तारित करता है? यही है, FOO(a)FOO1(a), FOO(a, b, c) से FOO3(a, b, c), आदि तक विस्तारित होना चाहिए। मुझे पता है कि एक मानक चाल है लेकिन मुझे यह प्रतीत नहीं होता है।वैराडिक मैक्रो चाल

कृपया इस प्रश्न को डुप्लिकेट के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें और उत्तर के साथ कोई अन्य प्रश्न होने पर इसे बंद करें। मुझे संदेह है कि वहां है लेकिन मुझे यह नहीं मिला।

+0

इस पोस्ट कुछ है कि आप उपयोगी हो सकता है: http://stackoverflow.com/ques tions/3420459/c-preprocessor-macro-overloading – Mat

+0

यहां जवाब देखें: http://stackoverflow.com/questions/2124339/c-preprocessor-va-args-number-of-arguments – Anycorn

+0

@aaa: इसके उत्तर प्रश्न इस सवाल का जवाब नहीं देते हैं। @Mat द्वारा लिंक किया गया सवाल अधिक समान है, हालांकि मैं इसे सटीक डुप्लिकेट नहीं मानूंगा। –

उत्तर

7

यह पोस्ट Variadic macro to count number of arguments है जो आप देख रहे हैं मुझे विश्वास है। पहले और दूसरे प्रतिक्रियाओं को देखो।

+0

धन्यवाद, यह लिंक सिर्फ वही था जो मुझे चाहिए था। यह संभावित-डुप्लिकेट पोस्ट की तुलना में काफी बेहतर है। –

+0

सी 99 में शून्य-तर्क को हल करने का कोई विचार? – mchiasson

+0

लिंक चला गया है, यूआरएल खराब DNS त्रुटि देता है – ACyclic

11
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N 
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1) 

#define FOO_IMPL2(count, ...) FOO ## count (__VA_ARGS__) 
#define FOO_IMPL(count, ...) FOO_IMPL2(count, __VA_ARGS__) 
#define FOO(...) FOO_IMPL(VA_NARGS(__VA_ARGS__), __VA_ARGS__) 

FOO(a) 
FOO(a, b) 
FOO(a, b, c) 

आमंत्रण ने ले ली है:

FOO1 (a) 
FOO2 (a, b) 
FOO3 (a, b, c) 
+0

उत्कृष्ट उत्तर, लेकिन 'FOO()' को कॉल करते समय शून्य-पैरामीटर केस को कैसे हल करें, जहां इसे 'FOO0()' में विस्तारित किया जाना चाहिए, लेकिन आपका समाधान 'FOO1() 'तक विस्तारित है? मैं जानना चाहता हूं कि यह शुद्ध सी 99 (कोई जीएनयू एक्सटेंशन) में कैसे करें – mchiasson

+0

@ मिचिसन: मेरे सबसे अच्छे ज्ञान के लिए, मानक सी में ऐसा करने का कोई तरीका नहीं है। आपको '__VA_ARGS__' को कम से कम एक टोकन पास करना होगा '; आप रिक्त तर्क सूची के साथ ऐसे मैक्रो को कॉल नहीं कर सकते हैं। –

5

जेम्स जवाब में सुधार करने से कुछ लचीलापन जोड़ने के लिए:

#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N 
#define VA_NARGS(...) VA_NARGS_IMPL(X,##__VA_ARGS__, 4, 3, 2, 1, 0) 
#define VARARG_IMPL2(base, count, ...) base##count(__VA_ARGS__) 
#define VARARG_IMPL(base, count, ...) VARARG_IMPL2(base, count, __VA_ARGS__) 
#define VARARG(base, ...) VARARG_IMPL(base, VA_NARGS(__VA_ARGS__), __VA_ARGS__) 

#define MyMacro0() Also works without arguments. 
#define MyMacro2(x,y) [x...y] 
#define MyMacro(...) VARARG(MyMacro, __VA_ARGS__) 

MyMacro() 
MyMacro(a) 
MyMacro(a, b) 
MyMacro(a, b, c) 

आउटपुट:

Also works without arguments. 
MyMacro1(a) 
[a...b] 
MyMacro3(a, b, c) 
+0

उत्कृष्ट उत्तर, लेकिन '## __ VA_ARGS__' केवल जीएनयू एक्सटेंशन के साथ काम करता है। क्या आप जानते हैं कि सी 99 के लिए इसे कैसे हल किया जाए? – mchiasson

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