what the literal following 0x8 0x1a 0x17 c++ syntax integer language-lawyer literals

c++ - 0x8 - what is the value of the following integer literal? 0x17



¿Por qué no se compila “0xe+1”? (1)

Mira este fragmento de código:

int a = 0xe+1;

Clang, gcc, icc no compilan esto:

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

MSVC compila con éxito.

¿Qué compilador es correcto? Si clang y gcc son correctos, ¿por qué sucede esto?

Nota: si agrego un espacio antes de + , el código se compila. Si cambio 0xe a 0xf , también se compila. ¿Quizás esto tiene que ver con la notación exponencial (como 1.2e+3 )?


0xe+1 se trata como un token de preprocesamiento de "número de preprocesamiento" único. Esta regla de tokenización no se alinea con la definición de literales numéricos en la gramática ordinaria; los números de preprocesamiento se definen como

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 .

Si las reglas de tokenización se basaran en las definiciones literales numéricas en lugar de la definición más simple de "número de preprocesamiento", su expresión sería tokenizada como 0xe + 1 , pero como las reglas no coinciden, obtiene un solo 0xe+1 , que no es un literal válido.