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语句中的拼写错误也可能导致此消息.
如果您使用的是 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在默认系统包含目录之前选择我的项目包含目录。
| 归档时间: |
|
| 查看次数: |
34085 次 |
| 最近记录: |