什么编译器错误"在令牌之前缺少二元运算符"意思?

时间:2014-01-24 17:08:12

标签: gcc compiler-errors c-preprocessor

我在尝试使用gcc编译时遇到以下错误:

  

错误:在令牌之前缺少二元运算符“(”

Web和SO搜索提出了这个错误的几个具体示例,并通过特定的代码更改来修复它们。但我没有找到导致发出此错误的条件的一般描述。

gcc何时以及为何会发出此错误?

4 个答案:

答案 0 :(得分:34)

这不是编译器错误,而是预处理器错误。当预处理器在尝试评估#if#elif指令中的表达式时遇到无效语法时,似乎会发生这种情况。

一个常见原因是sizeof指令中的#if运算符:

例如:

  #define NBITS (sizeof(TYPE)*8)
  //later
  #if (NBITS>16)    //ERROR

这是一个错误,因为sizeof is evaluated by the compiler, not the preprocesor

类型转换也是无效的预处理器语法:

  #define ALLBITS ((unsigned int) -1)
  //later
  #if (ALLBITS>0xFFFF)    //ERROR

rules for what can be in a valid expression are here

另请注意,#if会将未定义的宏计算为0,除非看起来需要参数,在这种情况下,您also get this error

因此,如果THIS未定义:

#if THIS == 0  //valid, true

#if THIS > 0 //valid, false

#if THIS() == 0  //invalid. ERROR

Typos in your #if statement也可能导致此消息。

答案 1 :(得分:0)

如果您使用的是Linux,请确保您的项目文件中没有名为features.h的标头。 我有一个用这个名字的人,结果是:

  

/usr/include/x86_64-linux-gnu/bits/huge_val.h:25:错误:需要函数指针

  

/usr/include/bits/huge_val.h:26:18:错误:令牌前缺少二进制运算符   “(”

这是因为某些系统标头,例如huge_val.h使用由__GNUC_PREREQ定义的像/usr/include/features.h这样的宏(了解有关此标头in this SO question的更多信息)。

在我的情况下,当我开始使用gcc的-I选项时,我第一次看到此错误,这突然使gcc选择了我的项目包含目录之前为默认系统包含目录。

答案 2 :(得分:0)

如果编译器标志中有-fno-operator-names,有时会出现此错误。我在构建json时遇到了确切的错误,此问题得以解决。

答案 3 :(得分:-1)

检查直接。没有空间,没有特别 经验值: add_subdirectory(Main)-> add_subdirectory(main)