2010-02-24 16 views
5

पर डिफ़ॉल्ट तर्क जोड़ना क्या विविधता मैक्रो में परिवर्तनीय तर्क से पहले डिफ़ॉल्ट तर्क जोड़ना संभव है? , उदा, मुझे लगता है मैं चर तर्क से पहले मैक्रो में 2 अधिक डिफ़ॉल्ट तर्क जोड़ने के लिए इतना है कि यह पिछले संस्करण प्रभावित नहीं होना चाहिए चाहते हैं की तरहविविध मैक्रो

#define MACRO(arg1, ...) func(arg1, ##__VA_ARGS__) 

मैक्रो कुछ का संस्करण है। पसंद:

#define MACRO(arg1, arg2 = "", arg3 = "", ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 

किसी भी मदद की सराहना की जाएगी।

+1

सी डिफ़ॉल्ट तर्क का समर्थन नहीं करता। क्या आपका मतलब सी ++ है? –

+0

सुनिश्चित नहीं है,

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__)
काम नहीं करेगा? – philant

+0

हां। ज़िक्र करना भूल गया। यह सी ++ के लिए है। धन्यवाद – vishal

उत्तर

4

मुझे नहीं लगता कि यह संभव है। कंपाइलर/प्रीप्रोसेसर कैसे जानता है कि दूसरा और तीसरा तर्क परिवर्तनीय तर्कों का हिस्सा है या डिफ़ॉल्ट मानों को ओवरराइड करता है? यही कारण है कि डिफ़ॉल्ट मान वाले पैरामीटर किसी फ़ंक्शन में अंतिम स्थिति में होना चाहिए।

मुझे डर है कि आपको दो मैक्रोज़ या तीन होना होगा यदि आप arg2 निर्दिष्ट करने और arg3 डिफ़ॉल्ट मान का उपयोग करने में सक्षम होने के लिए, लेकिन यह त्रुटि-प्रवण है।

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__) 
#define MACRO2(arg1, arg2, ...) func(arg1, arg2, "", ##__VA_ARGS__) 
#define MACRO3(arg1, arg2, arg3, ...) func(arg1, arg2, arg3, ##__VA_ARGS__) 
5

आप क्या कर सकते हैं:

struct foo { 
    int aaa; 
    char bbb; 
    char *ccc; 
}; 

#define BAR(...) bar((struct foo){__VA_ARGS__}) 

void bar(struct foo baz) 
    /* set defaults */ 
    if (!baz.aaa) 
     baz.aaa = 10; 
    if (!baz.bbb) 
     baz.bbb = 'z'; 
    if (!baz.ccc) 
     baz.ccc = "default"; 

    printf("%d, %c, %s\n", baz.aaa, baz.bbb, baz.ccc); 
} 

... 
BAR();      // prints "10, z, default" 
BAR(5);     // prints "5, z, default" 
BAR(5,'b');    // prints "5, b, default" 
BAR(5, 'b', "something"); // prints "5, b, something" 

बुरी बात इस बारे में - शून्य पैरामीटर पैरामीटर, उदा की तरह व्यवहार किया जाता है BAR(0, 'c') स्ट्रिंग का उत्पादन करेगा 10, c, default

+0

अफसोस की बात यह है कि यदि यह डिफॉल्ट डिफॉल्ट तर्क टाइप नामों के लिए हैं तो यह चाल नहीं करेगा। – PSkocik

+0

@PSkocik आपका क्या मतलब है? क्या आप विस्तार से बता सकते हैं? – qrdl

0

अपने प्रश्न के जवाब के रूप नहीं लेकिन एक तरह से बस अपनी समस्या को हल करने के लिए के रूप में:

#define MACRO(arg1, ...)   \ 
    /* pre-treatment */   \ 
    func(arg1, ##__VA_ARGS__)  \ 
    /* post-treatment */   \ 

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...); 
संबंधित मुद्दे