【问题标题】:Clang compiler error: invalid token at start of a preprocessor expressionClang 编译器错误:预处理器表达式开头的标记无效
【发布时间】:2019-05-09 10:08:34
【问题描述】:

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

#if __WORDSIZE == 64

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

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

#define __WORDSIZE

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

【问题讨论】:

    标签: macros clang c-preprocessor preprocessor


    【解决方案1】:

    从技术上讲,预处理器表达式并不完全是__WORDSIZE == 64;但是,它是这些令牌产生的。在构建实际表达式之前,会扫描表达式中的标记;发生宏观扩张。这就是重点;您想检查定义的宏 __WORDSIZE 是否为 64。

    如果在此扫描期间发现__WORDSIZE 没有 扩展,那么您将得到__WORDSIZE == 64 作为表达式;在这种特殊情况下,任何剩余的标识符在评估之前都被视为0...这意味着您正在评估表达式0 == 64,这是错误的。

    但在您的情况下,您正在定义一个像宏 __WORDSIZE 这样的对象,其替换列表为空。所以在扩展之后,你会得到:== 64。第一个标记是==,但这应该是一个二元运算符。那是无效的;即,您的invalid token at start of a preprocessor expression==

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      相关资源
      最近更新 更多