C宏包含“不完整”的三元运算符

时间:2015-09-21 16:51:16

标签: c macros ternary-operator

我正在尝试编译以下内容(在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;确实直接在我的代码中插入这一行编译得很好。我在这里缺少一些宏观的细微差别吗?

如果这是一个愚蠢的问题,我道歉 - 我对宏很新,有点困惑。

2 个答案:

答案 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);

删除宏内容周围的括号,它应该可以工作。