2010-02-24 85 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 = "", ...);