我想在C ++中编写一个宏,根据比较,返回逗号和值,或者根本不返回任何内容。
#define TEST1(x) \
x == 1 ? COMMA 2 : NADA
#define COMMA ,
#define NADA
这个想法是,当参数为1时,宏将返回, 2
,否则将不返回任何内容,因此
int foo[5] = { 0 TEST1(1) TEST1(2) };
将编译为:
int foo[5] = { 0 , 1 };
第一个错误是:missing '}' before constant
。
答案 0 :(得分:2)
您的宏没有按照您的想法执行操作。宏只是文本替换,因此它将替换TEST(abc)为“x == abc?,2:”。它不会在编译时评估表达式。
您的代码不会使用此替换进行编译。您可以运行gcc -E file.c
以查看编译器在预处理代码时正在执行的操作。这是输出:
int main() {
int foo[5] = {0 (1 == 1) ? , 2 : (2 == 1) ? , 2 : };
return 0;
}
您可能不应该使用宏来完成此任务。告诉我们您为什么尝试这一点,我们或许可以为您提供更合适的选择。
答案 1 :(得分:1)
你不应该自己写这样的宏,除非是为了智力的乐趣。更好地使用现有的软件包,如Boost或P99。在P99中,你有一大堆preprocessor conditionals,例如P99_IF_EQ
,它测试两个数字是否相等,并从两个值中选择。对于您的问题,这似乎类似于P99_IF_EQ(X,1)(, 2)()
。