【问题标题】:Clang compiler error: invalid token at start of a preprocessor expressionClang 编译器错误:预处理器表达式开头的标记无效
【发布时间】:2019-05-09 10:08:34
【问题描述】:
在 Windows 上使用 clang 编译器会抛出“在预处理器表达式开始时的标记无效”
#if __WORDSIZE == 64
./bits/types.h:42:16: 错误:预处理器表达式开头的标记无效
为了确保定义了__WORDSIZE,我添加了
#define __WORDSIZE
按预期抛出警告./bits/wordsize.h:8:9: warning: '__WORDSIZE' macro redefined [-Wmacro-redefined]
【问题讨论】:
标签:
macros
clang
c-preprocessor
preprocessor
【解决方案1】:
从技术上讲,预处理器表达式并不完全是__WORDSIZE == 64;但是,它是从这些令牌产生的。在构建实际表达式之前,会扫描表达式中的标记;发生宏观扩张。这就是重点;您想检查定义的宏 __WORDSIZE 是否为 64。
如果在此扫描期间发现__WORDSIZE 没有 扩展,那么您将得到__WORDSIZE == 64 作为表达式;在这种特殊情况下,任何剩余的标识符在评估之前都被视为0...这意味着您正在评估表达式0 == 64,这是错误的。
但在您的情况下,您正在定义一个像宏 __WORDSIZE 这样的对象,其替换列表为空。所以在扩展之后,你会得到:== 64。第一个标记是==,但这应该是一个二元运算符。那是无效的;即,您的invalid token at start of a preprocessor expression 是==。