在windows上使用clang编译器会在预处理器表达式的开头抛出"无效令牌">
#if __WORDSIZE == 64
/位/类型。h:42:16:错误:预处理器表达式开始时的无效令牌
为了确保定义了__WORDSIZE,我添加了
#define __WORDSIZE
如预期那样抛出警告CCD_ 1
预处理器表达式在技术上不完全是__WORDSIZE == 64
;但是,它是由这些令牌生成的。在构建实际表达式之前,将扫描表达式中的标记;发生了宏观扩张。这就是重点;要检查定义的宏CCD_ 3是否为64。
如果在扫描过程中__WORDSIZE
是而不是展开的,则可以得到__WORDSIZE == 64
作为表达式;在这种特殊情况下,在评估…之前,任何剩余的标识符都被视为0
。。。这意味着您正在评估表达式0 == 64
,这是错误的。
但在您的情况下,您定义了一个对象,如具有空替换列表的宏__WORDSIZE
。因此,在扩展之后,您只需得到:== 64
。第一个标记是./bits/wordsize.h:8:9: warning: '__WORDSIZE' macro redefined [-Wmacro-redefined]
0,但它应该是一个二进制运算符。这是无效的;即您的invalid token at start of a preprocessor expression
是==
。