有没有办法让宏具有不同的行为,如果它有括号?

时间:2016-03-08 22:49:31

标签: c++ c-preprocessor

我正在尝试做这样的事情:

#define FOO printf("No paren\n");
#define FOO(x) printf(x);

有没有办法用c ++宏做到这一点?

3 个答案:

答案 0 :(得分:8)

没有。给定的宏名称可以是普通的(“类似对象”)或“类似函数”,而不是两者。

答案 1 :(得分:4)

我不建议它,但是 可以在C ++本身的帮助下实现,

1

Live one Ideone https://ideone.com/VboP8R

答案 2 :(得分:1)

不那么直接:单个宏必须是" plain"或"功能类似"。

但是,你可以在这方面做点事情。

您可以使用可变参数宏并根据number of arguments更改行为。

您可以使用上述内容构建要委派给的目标宏的名称:

#define NUM_ARGS_(_10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N

#define NUM_ARGS(...) NUM_ARGS_(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)

#define CONCAT_(a, b) a##b
#define CONCAT(a, b) CONCAT_(a, b)

#define CAKE_1(X) some-interesting-code-here
#define CAKE_2(X, Y) some-different-interesting-code-here
#define CAKE(...) CONCAT(CAKE_, NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)

在上面,使用1参数调用CAKE()将调用CAKE_1,并使用2调用它将调用CAKE_2。

出于清晰等原因,做这类事情是否是一个好主意,留给读者作为练习。