为什么"0xe+1"不编译?

Why doesn't "0xe+1" compile?

本文关键字:编译 0xe+1 为什么      更新时间:2023-10-16

看看这个代码片段:

int a = 0xe+1;

Clang,gcc,icc不编译这个:

t.cpp:1:12: error: invalid suffix '+' on integer constant

MSVC 成功编译。

哪个编译器是正确的?如果 clang 和 gcc 是正确的,为什么会发生这种情况?

注意:如果我在+之前添加一个空格,代码就会编译。如果我将0xe更改为0xf,它也可以编译。也许这与指数表示法有关(如1.2e+3)?

0xe+1被视为单个"预处理数字"预处理令牌。此标记化规则与普通语法中数字文字的定义不太一致;预处理数字定义为

pp-number:
digit
. digit
pp-number digit
pp-number identifier-nondigit
pp-number ' digit
pp-number ' nondigit
pp-number e sign
pp-number E sign
pp-number p sign
pp-number P sign
pp-number .

如果标记化规则基于数字文本定义而不是更简单的"预处理数字"定义,则表达式将被标记为0xe + 1,但由于规则不匹配,您将获得单个0xe+1标记,这不是有效的文本。