关于gcc:编译器错误“令牌前缺少二进制运算符”是什么意思?

您所在的位置:网站首页 令牌错误是什么意思 关于gcc:编译器错误“令牌前缺少二进制运算符”是什么意思?

关于gcc:编译器错误“令牌前缺少二进制运算符”是什么意思?

2024-07-16 09:05| 来源: 网络整理| 查看: 265

尝试使用gcc进行编译时,最近出现以下错误:

error: missing binary operator before token"("

Web和SO搜索提供了此错误的几个特定示例,并进行了特定的代码更改以修复它们。 但是我没有找到导致此错误的原因的一般描述。

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

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

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

例如:

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

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

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

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

有效表达式中的规则在此处。

另请注意,#if会将未定义的宏的值评估为0,除非看起来像接受参数一样,在这种情况下,您还会收到此错误:

因此,如果未定义THIS:

12345#if THIS == 0  //valid, true #if THIS > 0 //valid, false #if THIS() == 0  //invalid. ERROR

您的#if语句中的错别字也会导致此消息。

相关讨论 错误消息的确令人误解,恕我直言,预处理器应针对实际发生的错误输出更有意义的消息。因此,Ive刚刚在GCC Bugzilla中报告了一个错误:错误87351-误导性错误消息:在标记"("之前缺少二进制运算符 这个答案与问题无关。它只是解释预处理器语法。 嗯,我既写了问题,也写了这个答案。问题是"此错误消息是什么意思"。答案是"其在条件中具有前处理器语法错误,这是导致该错误的一些常见语法示例"。我写这篇文章是因为当我尝试查找此错误消息的原因时,我发现的所有内容都是使错误消失的具体更改示例,但没有说明该消息的实际含义。随时改善答案,这就是编辑按钮的作用。

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

/usr/include/x86_64-linux-gnu/bits/huge_val.h:25: error: function pointer expected

要么

/usr/include/bits/huge_val.h:26:18: error: missing binary operator before token "("

这是因为某些系统标头(如huge_val.h)使用由/usr/include/features.h定义的宏(如__GNUC_PREREQ)(在此SO问题中了解有关此标头的更多信息)。

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

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

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

相关讨论 您的答案很难理解。 CMake与这有什么关系? 您可以检查您的文件夹名称。我已经通过这种方式解决了这个问题。 然后,我建议您a)添加更多上下文并解释您使用CMake的方式,b)为清晰起见,改进答案的语法和格式。 请参阅:crifan.com/



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3