【问题标题】:What does the compiler error "missing binary operator before token" mean?编译器错误“在令牌之前缺少二元运算符”是什么意思?
【发布时间】:2014-02-15 18:49:31
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: gcc compiler-errors c-preprocessor


    【解决方案1】:

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

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

    例如:

      #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 也可能导致此消息。

    【讨论】:

    • 错误信息确实具有误导性,恕我直言,对于实际发生的错误,预处理器应该输出更有意义的错误信息。所以,我刚刚在 GCC Bugzilla 中报告了一个错误:Bug 87351 - misleading error message: missing binary operator before token "("
    • 这个答案与问题无关;它只是解释预处理器语法。
    • 嗯,我写了这个问题和这个答案。问题是“此错误消息是什么意思”。答案是“这是条件句中的预处理器语法错误,这里有一些常见的导致它的语法示例。”我写这篇文章是因为当我试图搜索此错误消息的原因时,我发现的所有内容都是使其消失的特定更改示例,但没有解释该消息的实际 含义。随意改进答案,这就是编辑按钮的用途。
    【解决方案2】:

    如果您使用的是 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 在默认系统包含目录之前选择我的项目包含目录。

    【讨论】:

    • 由于文件 <path-to>/Vivado/2017.4/lnx64/tools/gcc/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.6.3/include-fixed/features.h:339:0 而在 Xilinx Vivado HLS C 综合中遇到了与 features 标头类似的问题
    【解决方案3】:

    如果您的编译器标志中有-fno-operator-names,有时您会收到此错误。我在构建 json 时遇到了确切的错误,这解决了它。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您可以查看文件夹的名称。我已经通过这种方式解决了这个问题。
      • 那么我建议您 a) 添加更多上下文并解释您是如何使用 CMake 的,b) 改进答案的语法和格式以使其清晰。
      • 参考:crifan.com/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2022-11-13
      相关资源
      最近更新 更多