簡體   English   中英

向variadic宏添加默認參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM