我将旧的代码库移植到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
,因为预处理器宏无法使用它。
请建议我该如何解决?
答案 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