我正在尝试编译以下内容(在MSVC中):
#define TRAP (errorCode = (errorCode != 0) ? errorCode :)
int someFunction(int a) {
printf("Called function with parameter %d\", a);
return (a > 3);
}
int main(void) {
int errorCode = 0;
printf("Error code starts out as %d\n", errorCode); // errorCode should be 0
TRAP someFunction(1);
printf("Error code is now %d\n", errorCode); // errorCode should still be 0
TRAP someFunction(4);
printf("Error code is now %d\n", errorCode); // errorCode should be 1
TRAP someFunction(2);
printf("Error code is now %d\n", errorCode); // errorCode should still be 1, someFunction should not be called.
return 0;
}
但是,我在包含“TRAP”
的第一行收到编译器错误error C2059: syntax error : ')'
我的问题是:为什么?据我了解,宏预处理器只对所有“TRAP”实例进行查找替换,并将其替换为最外面括号之间的宏文本。因此,在宏完成其工作之后,我希望第一个TRAP行读取:
errorCode = (errorCode != 0) ? errorCode : someFunction(1);
哪个是有效的C;确实直接在我的代码中插入这一行编译得很好。我在这里缺少一些宏观的细微差别吗?
如果这是一个愚蠢的问题,我道歉 - 我对宏很新,有点困惑。
答案 0 :(得分:2)
让TRAP
以您希望的方式工作,并希望将TRAP
定义为
#define TRAP (errorCode = (errorCode != 0) ? errorCode :
即。没有尾随)
。然后,当您使用宏时,您需要提供尾随右侧,如
TRAP someFunction(1));
这有点难看。让它看起来有点“更好”"您可以参数化定义,如
#define TRAP(func) (errorCode = (errorCode != 0) ? errorCode : (func))
然后将其作为
调用TRAP(someFunction(1));
祝你好运。
答案 1 :(得分:1)
它会起作用,但你已经在括号中包围了宏的内容,所以它扩展为,例如(errorCode = (errorCode != 0) ? errorCode :) someFunction(1);
删除宏内容周围的括号,它应该可以工作。