我写了这个简单的程序
#include <time.h>
int main()
{
#if ((clock_t)1000)
int x = 10;
#endif
return 0;
}
在编译时,我看到以下错误:
错误C1012不匹配的括号:缺少&#39;)&#39;
为什么我收到此错误?
更改以下行:
#if ((clock_t)1000)
为:
#if (clock_t)1000
解决了编译错误。
但我无法做到这一点,因为((clock_t)1000)使用limits.h头文件中的#define指令定义为宏:
#define CLOCKS_PER_SEC ((clock_t)1000)
我需要直接使用它。
编辑:
请原谅我以一种不明确的方式提出问题。 现在重新构思我的问题:
我有以下代码:
#include <time.h>
#define DUMMY_CLOCKS_PER_SEC ((clock_t)1000)
int main()
{
#if CLOCKS_PER_SEC != DUMMY_CLOCKS_PER_SEC
#error "out of sync"
#endif
return 0;
}
但这会产生编译错误:
错误C1012不匹配的括号:缺少&#39;)&#39;
答案 0 :(得分:3)
预处理器对C ++数据类型一无所知,也不了解强制转换表达式。它用于简单的文本处理,==
和!=
只能比较单个令牌。
在C ++中进行比较,而不是预处理器。
static_assert(CLOCKS_PER_SEC == DUMMY_CLOCKS_PER_SEC, "out of sync");
int main() {
return 0;
}
不要担心运行时性能开销。由于两个宏都扩展为文字,因此编译器会对其进行优化。
答案 1 :(得分:2)
您将预处理器宏定义(CLOCKS_PER_SEC
)与其扩展(即实现定义,并且在您的情况下似乎是((clock_t)1000)
)混淆。
您在代码中想要做的事情并不十分清楚。
如果要检查是否定义了此宏,可以使用预处理器#ifdef
,例如:
#ifdef CLOCKS_PER_SEC
// your code
#endif
无论如何,这个CLOCKS_PER_SEC
macro是由标准定义的,因此它应该始终在符合标准的time.h
库实现中定义。
如果您有不同的想法,请澄清您的目标。
编辑根据您在下面的澄清评论,您可能希望使用if
来比较这两个宏的值(扩展):
if (DUMMY_CLOCKS_PER_SEC != CLOCKS_PER_SEC) {
...
} else {
...
}
答案 2 :(得分:1)
((clock_t)1000)使用limits.h头文件中的#define指令定义为宏:
#define CLOCKS_PER_SEC ((clock_t)1000)
该文件未定义名为((clock_t)1000)
的宏。它定义了一个名为CLOCKS_PER_SEC
的宏。 ((clock_t)1000)
是宏的值。
((clock_t)1000)
不是宏,并且是#if
指令中无法使用的内容。
答案 3 :(得分:-1)
感谢大家的所有回复。
我解决这个问题的另一个解决方案是使用constexpr说明符,它是c ++ 11的一个特性。 ConstExpr允许我们在编译时评估变量或函数的值。
更改代码:
#if CLOCKS_PER_SEC != DUMMY_CLOCKS_PER_SEC
#error "out of sync"
#endif
以下解决了这个问题:
constexpr int DUMMY_CLOCK_NOT_EQUAL = (DUMMY_CLOCKS_PER_SEC != CLOCKS_PER_SEC) ? 1 : 0;
#if DUMMY_CLOCK_NOT_EQUAL
#error "out of sync"
#endif