向可变参数宏添加默认参数

发布于 2024-08-22 23:06:50 字数 299 浏览 8 评论 0原文

是否可以在可变宏中的变量参数之前添加默认参数? 例如,我有宏的版本,就像

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

我想在变量参数之前在宏中添加 2 个默认参数,这样它就不会影响以前的版本。喜欢:

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

任何帮助将不胜感激。

Is it possible to add default arguments before variable argument in variadic macro?
e.g I have the version of macro something like

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

I would like to add 2 more default arguments in the macro before variable arguments so that it should not affect previous version. Like:

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

Any help would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

z祗昰~ 2024-08-29 23:06:50

我认为这是不可能的。编译器/预处理器如何知道第二个和第三个参数是变量参数的一部分还是覆盖默认值?
这就是为什么具有默认值的参数必须位于函数的最后位置的原因。

如果您能够指定 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__)

I do not think this is possible. How would the compiler/preprocessor knows if the second and third arguments are part of the variable arguments or override the default values ?
That's the reason why parameters with default values have to be in last position in a function.

I'm afraid you'll have to have two macros or three if you to be able to specify arg2 and use arg3 default value, but this is error-prone.

#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__)
弥枳 2024-08-29 23:06:50

你可以做什么:

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

What you can do:

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"

Bad thing about this - zero parameter is treated like no parameter, e.g. BAR(0, 'c') will produce string 10, c, default

本宫微胖 2024-08-29 23:06:50

不是作为问题的答案,而是作为简单解决问题的方法:

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

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

Not as an answer to your question but as a way to simply solve your problem:

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

void func (type1 arg1, type2 arg2 = "", type3 arg3 = "", ...);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文