Macros Clang编译器错误:预处理器表达式开头的标记无效
在windows上使用clang编译器会抛出“预处理器表达式开头的无效标记” ./bits/types.h:42:16:错误:预处理器表达式开头的标记无效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;但是,
#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、 例如,预处理器表达式开头的无效标记是=