看下面的代码片段:

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被视为单个"preprocessing number" preprocessing token。这个分词规则与普通语法中数字文字的定义不太吻合。预处理编号定义为

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标记,而不是有效文字。

关于c++ - “0xe+1”为什么不编译?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49543516/

10-16 04:35