无与伦比的括号:缺少')'在#if指令中

时间:2017-08-25 09:25:08

标签: c++ compiler-errors

我写了这个简单的程序

#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;

4 个答案:

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