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

ASh*_*lly 18 gcc compiler-errors c-preprocessor

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

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

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

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

ASh*_*lly 36

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

一个常见原因是指令中的sizeof操作员#if:

例如:

  #define NBITS (sizeof(TYPE)*8)
  //later
  #if (NBITS>16)    //ERROR
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为它sizeof是由编译器而不是预处理器评估的.

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

  #define ALLBITS ((unsigned int) -1)
  //later
  #if (ALLBITS>0xFFFF)    //ERROR
Run Code Online (Sandbox Code Playgroud)

可以在有效表达式中规则在这里.

另请注意,#if将未定义的宏计算为0,除非它看起来像需要参数,在这种情况下,您也会收到此错误:

所以,如果THIS未定义:

#if THIS == 0  //valid, true

#if THIS > 0 //valid, false

#if THIS() == 0  //invalid. ERROR
Run Code Online (Sandbox Code Playgroud)

#if语句中的拼写错误也可能导致此消息.

  • 嗯,我写了这个问题和这个答案。问题是“这个错误消息是什么意思”。答案是“这是条件语句中的预处理器语法错误,以下是导致该错误的一些常见语法示例。” 我写这篇文章是因为当我试图搜索此错误消息的原因时,我发现的所有内容都是使其消失的具体更改示例,但没有解释该消息的实际含义。请随意改进答案,这就是编辑按钮的用途。 (4认同)

Gab*_*ers 6

如果您使用的是 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在此 SO 问题中了解有关此标头的更多信息)定义的宏)。

就我而言,当我开始使用 gcc 的 -I 选项时,我第一次看到此错误,该选项突然使 gcc在默认系统包含目录之前选择我的项目包含目录。