我在尝试使用gcc编译时遇到以下错误:
错误:在令牌之前缺少二元运算符“(”
Web和SO搜索提出了这个错误的几个具体示例,并通过特定的代码更改来修复它们。但我没有找到导致发出此错误的条件的一般描述。
gcc何时以及为何会发出此错误?
答案 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)