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

Macros Clang编译器错误:预处理器表达式开头的标记无效,macros,clang,c-preprocessor,preprocessor,Macros,Clang,C Preprocessor,Preprocessor,在windows上使用clang编译器会抛出“预处理器表达式开头的无效标记” ./bits/types.h:42:16:错误:预处理器表达式开头的标记无效 #if __WORDSIZE == 64 为了确保定义了uuuWordSize,我添加了 #define __WORDSIZE 它抛出警告/bits/wordsize.h:8:9:warning:“\uu wordsize”宏重定义[-Wmacro重定义]正如预期的那样预处理器表达式在技术上不太符合\uu wordsize==64;但是,

在windows上使用clang编译器会抛出“预处理器表达式开头的无效标记”

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

#if __WORDSIZE == 64
为了确保定义了uuuWordSize,我添加了

#define __WORDSIZE

它抛出警告
/bits/wordsize.h:8:9:warning:“\uu wordsize”宏重定义[-Wmacro重定义]
正如预期的那样

预处理器表达式在技术上不太符合
\uu wordsize==64
;但是,它是由这些代币产生的。在构建实际表达式之前,将扫描表达式中的标记;进行宏观扩展。这就是重点;您要检查定义的宏
\uuuuu字号
是否为64

如果在扫描过程中,
\uuuuuWordSize
没有展开,那么您将得到
\uuuWordSize==64
作为表达式;在这种特殊情况下,任何剩余的标识符在计算之前都被视为
0
。。。这意味着您正在计算表达式
0==64
,该表达式为false

但在您的例子中,您定义的对象类似于宏
\uuuuWordSize
,其替换列表为空。因此,在展开之后,您只需得到:
==64
。这里的第一个标记是
==
,但它应该是一个二进制运算符。那是无效的;i、 例如,预处理器表达式开头的
无效标记是
=