2010-02-24 88 views
5

是否可以在可變參數宏中的可變參數前添加默認參數? e.g我有宏觀像將默認參數添加到可變參數宏

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

的版本,我想在宏添加2個默認參數變量參數之前,所以,它不應該影響到以前的版本。喜歡:

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

任何幫助,將不勝感激。

+1

C不支持默認參數。你的意思是C++嗎? – 2010-02-24 11:40:59

+0

不知道在理解中,會不會

#define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__)
的作品? – philant 2010-02-24 11:46:22

+0

是的。忘了提及。它適用於C++。 謝謝 – vishal 2010-02-24 11:47:29

回答

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 2017-10-02 12:41:23

+0

@PSkocik你是什麼意思?你能否詳細說明一下? – qrdl 2017-10-02 15:00:57

0

不是作爲一個回答你的問題,但作爲一種簡單的解決您的問題:

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

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...);