我正在尝试做这样的事情:
#define FOO printf("No paren\n");
#define FOO(x) printf(x);
有没有办法用c ++宏做到这一点?
答案 0 :(得分:8)
没有。给定的宏名称可以是普通的(“类似对象”)或“类似函数”,而不是两者。
答案 1 :(得分:4)
答案 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。
出于清晰等原因,做这类事情是否是一个好主意,留给读者作为练习。