[英]Adding default arguments to variadic macro
是否有可能在可變參數宏中的變量參數之前添加默認參數? 例如,我有像宏的版本
#define MACRO(arg1, ...) func(arg1, ##__VA_ARGS__)
我想在變量參數之前在宏中添加另外2個默認參數,這樣它就不會影響以前的版本。 喜歡:
#define MACRO(arg1, arg2 = "", arg3 = "", ...) func(arg1, arg2, arg3, ##__VA_ARGS__)
任何幫助,將不勝感激。
你可以做什么:
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
我不認為這是可能的。 如果第二個和第三個參數是變量參數的一部分還是覆蓋默認值,編譯器/預處理器將如何知道? 這就是為什么具有默認值的參數必須位於函數中的最后位置的原因。
如果你能夠指定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__)
不是作為您問題的答案,而是作為簡單解決問題的方法:
#define MACRO(arg1, ...) \
/* pre-treatment */ \
func(arg1, ##__VA_ARGS__) \
/* post-treatment */ \
void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.