Clang 编译器错误:预处理器表达式开头的标记无效

cor*_*ing 1 macros preprocessor clang c-preprocessor

在 Windows 上使用 clang 编译器会抛出“预处理器表达式启动时的无效标记”

#if __WORDSIZE == 64
Run Code Online (Sandbox Code Playgroud)

./bits/types.h:42:16:错误:预处理器表达式开头的标记无效

为了确保 __WORDSIZE 已定义,我添加了

#define __WORDSIZE
Run Code Online (Sandbox Code Playgroud)

./bits/wordsize.h:8:9: warning: '__WORDSIZE' macro redefined [-Wmacro-redefined]这会按预期发出警告

H W*_*ers 5

从技术上讲,预处理器表达式并不完全是__WORDSIZE == 64;相反,它是这些代币产生的。在构建实际表达式之前,会扫描表达式中的标记;发生宏观扩张。这就是重点;您想检查定义的宏是否__WORDSIZE为 64。

如果结果表明在此扫描期间__WORDSIZE没有扩展,那么您将得到__WORDSIZE == 64一个表达式;在这种特殊情况下,任何剩余的标识符都将被视为0评估之前...这意味着您正在评估表达式0 == 64,这是错误的。

但就您而言,您正在定义一个__WORDSIZE带有空替换列表的对象,例如宏。因此,扩展后,您只需得到:== 64。第一个标记是==,但这应该是一个二元运算符。那是无效的;即,你的invalid token at start of a preprocessor expression==