Clang编译器错误:预处理器表达式开头的令牌无效

时间:2018-12-07 15:59:04

标签: macros clang c-preprocessor preprocessor

在Windows上使用clang编译器会抛出“在预处理程序表达式开始时无效的令牌”

#if __WORDSIZE == 64

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

为确保已定义__WORDSIZE,我已添加

#define __WORDSIZE

它会按预期抛出警告./bits/wordsize.h:8:9: warning: '__WORDSIZE' macro redefined [-Wmacro-redefined]

1 个答案:

答案 0 :(得分:0)

从技术上讲,预处理器表达式不是__WORDSIZE == 64;而是由这些令牌 产生的。在构建实际表达式之前,先扫描表达式中的标记。发生宏扩展。这就是重点;您要检查已定义的宏__WORDSIZE是否为64。

如果在此扫描过程中发现__WORDSIZE未扩展 ,那么您将获得__WORDSIZE == 64作为表达式;在这种特定情况下,在评估之前,所有剩余的标识符都将被视为0……这意味着您正在评估表达式0 == 64,这是错误的。

但是,在您的情况下,您正在定义带有空替换列表的宏__WORDSIZE之类的对象。因此,扩展后,您只需获得:== 64。那里的第一个标记是==,但这应该是二进制运算符。那是无效的;即您的invalid token at start of a preprocessor expression==