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]这会按预期发出警告
从技术上讲,预处理器表达式并不完全是__WORDSIZE == 64;相反,它是由这些代币产生的。在构建实际表达式之前,会扫描表达式中的标记;发生宏观扩张。这就是重点;您想检查定义的宏是否__WORDSIZE为 64。
如果结果表明在此扫描期间__WORDSIZE没有扩展,那么您将得到__WORDSIZE == 64一个表达式;在这种特殊情况下,任何剩余的标识符都将被视为0评估之前...这意味着您正在评估表达式0 == 64,这是错误的。
但就您而言,您正在定义一个__WORDSIZE带有空替换列表的对象,例如宏。因此,扩展后,您只需得到:== 64。第一个标记是==,但这应该是一个二元运算符。那是无效的;即,你的invalid token at start of a preprocessor expression是==。