VS 2015在预处理中使用CLOCKS_PER_SEC中断代码

时间:2015-11-30 06:59:46

标签: c++ compiler-errors visual-studio-2015

我将旧的代码库移植到VS 2015。 代码是:

#if XYZ 
  ....
#elif CLOCKS_PER_SEC > 999 //<< Getting error here.
  ...
#endif

我在第CLOCKS_PER_SEC行收到错误:

Severity    Code    Description 
Error       C1012   unmatched parenthesis: missing ')'

查看CLOCKS_PER_SEC

time.h的定义
// The number of clock ticks per second
#define CLOCKS_PER_SEC  ((clock_t)1000)

所以,看起来好像是因为clock_t,因为预处理器宏无法使用它。

请建议我该如何解决?

1 个答案:

答案 0 :(得分:3)

C语言规范在7.1.4 / 1中说明

  

所有类似对象的宏都列为扩展为整数常量   表达式还应适用于#if   预处理指令。

但是,宏CLOCKS_PER_SEC未列为整数常量表达式(7.27.1 / 2)。这意味着它无法在#if下轻松使用。

这正是你刚遇到的。您应该开发一种在代码中实现条件编译的替代方法。一般情况下,CLOCKS_PER_SEC不能与#if一起使用。语言标准要求CLOCKS_PER_SEC具有clock_t类型,而不是int类型,这意味着广告素材在那里完全合理。

PS 请注意,您当前的CLOCKS_PER_SEC 定义符合整数常量表达式,但#if对条件表达式提出了一些额外要求。也就是说,不允许演员阵容。

P.P.S。在C99的原始版本中,CLOCKS_PER_SEC被描述为常量表达式。但是,在C99 + TC2中,“常数”这个词不再存在。它被删除以消除上述要求之间的矛盾:1)常量表达式宏可用于#if,这可以排除强制转换,2)CLOCKS_PER_SEC具有clock_t类型,这是只有通过演员才能实现。相应的缺陷报告可在此处找到:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_281.htm