【问题标题】:Adding default arguments to variadic macro向可变参数宏添加默认参数
【发布时间】:2011-01-20 11:55:29
【问题描述】:

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

  • C 不支持默认参数。你是说 C++ 吗?
  • 不确定在理解中,
    #define MACRO(arg1, ...) func(arg1, "", "", ##__VA_ARGS__)
    是否有效?
  • 是的。忘了提。它适用于 C++。谢谢
  • 确实,func() 中的参数 arg1 和 arg2 将根据源内部 MACRO() 中这些参数的值来决定。可以为空以支持向后兼容。

标签: c++ c-preprocessor variadic-functions variadic-macros


【解决方案1】:

不是作为对您问题的回答,而是作为一种简单地解决您的问题的方法:

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

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

【讨论】:

    【解决方案2】:

    你可以做什么:

    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

    【讨论】:

    • 不幸的是,如果要默认的参数是类型名称,这将不起作用。
    • @PSkocik 你是什么意思?能详细点吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 2021-09-10
      • 2022-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多