在Windows上使用clang编译器会抛出“在预处理程序表达式开始时无效的令牌”
#if __WORDSIZE == 64
./ bits / types.h:42:16:错误:预处理器表达式开头的令牌无效
为确保已定义__WORDSIZE,我已添加
#define __WORDSIZE
它会按预期抛出警告./bits/wordsize.h:8:9: warning: '__WORDSIZE' macro redefined [-Wmacro-redefined]
答案 0 :(得分:0)
从技术上讲,预处理器表达式不是__WORDSIZE == 64
;而是由这些令牌 产生的。在构建实际表达式之前,先扫描表达式中的标记。发生宏扩展。这就是重点;您要检查已定义的宏__WORDSIZE
是否为64。
如果在此扫描过程中发现__WORDSIZE
未扩展 ,那么您将获得__WORDSIZE == 64
作为表达式;在这种特定情况下,在评估之前,所有剩余的标识符都将被视为0
……这意味着您正在评估表达式0 == 64
,这是错误的。
但是,在您的情况下,您正在定义带有空替换列表的宏__WORDSIZE
之类的对象。因此,扩展后,您只需获得:== 64
。那里的第一个标记是==
,但这应该是二进制运算符。那是无效的;即您的invalid token at start of a preprocessor expression
是==
。