【发布时间】:2014-02-15 18:49:31
【问题描述】:
我最近在尝试使用 gcc 编译时遇到以下错误:
错误:在标记“(”之前缺少二元运算符
Web 和 SO 搜索找到了该错误的几个具体示例,并通过特定的代码更改来修复它们。但我没有找到关于什么条件导致此错误发出的一般描述。
gcc 何时以及为什么会发出此错误?
【问题讨论】:
标签: gcc compiler-errors c-preprocessor
我最近在尝试使用 gcc 编译时遇到以下错误:
错误:在标记“(”之前缺少二元运算符
Web 和 SO 搜索找到了该错误的几个具体示例,并通过特定的代码更改来修复它们。但我没有找到关于什么条件导致此错误发出的一般描述。
gcc 何时以及为什么会发出此错误?
【问题讨论】:
标签: gcc compiler-errors c-preprocessor
这不是编译器错误,而是预处理器错误。当预处理器在尝试评估 #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 也可能导致此消息。
【讨论】:
如果您使用的是 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 标头类似的问题
如果您的编译器标志中有-fno-operator-names,有时您会收到此错误。我在构建 json 时遇到了确切的错误,这解决了它。
【讨论】:
检查直接。没有空间,没有特别 经验: add_subdirectory(Main)->add_subdirectory(main)
【讨论】: