登录预处理数量

问题描述:

在第2.10节中的C++标准14([lex.ppnumber]),预处理号码被定义为登录预处理数量

pp-number 
    digit 
    . digit 
    pp-number digit 
    pp-number ' digit 
    pp-number ' nondigit 
    pp-number identifier-nondigit 
    pp-number e sign 
    pp-number E sign 
    pp-number . 

因此,这应包括所有整数文字令牌和所有浮动字面令牌。但是如2.14.4([lex.fcon])所写,有一个符号是可选的,即(如果有一种方法可以像在标准中那样格式化,可以随意改进)。

exponent-part: 
    e sign_opt digit-sequence 
    E sign_opt digit-sequence 
sign: one of 
    + - 

为什么pp-number定义中的符号不​​是可选的?实际上,它的编写方式是,数字1e3应该是浮动字面的,但不是pp-number,这与第2.10节给出的解释相矛盾。

有什么事我不明白?

+0

'1E3'是一个有效的pp号码。 'E'使用标识符非数字制作。 –

here从引用:

甲预处理数具有相当奇异定义。类别包括所有正常的整数和浮点常量 一个希望的C,也有一些其他的事情之一可能无法 最初承认的数字。在形式上,预处理号码开始 带有可选的句点,一个必需的十进制数字,然后用任何字母,数字,下划线,句号和 指数序列继续 。指数是两个字符序列'e +','e-','E +', 'E-','p +','p-','P +'和'P-'。 (以“P” 或“P”开头的指数是新的C99。它们用于十六进制浮点 常量。)

这个不寻常的定义的目的是给预处理从全隔离数字常量的复杂性。它确实 不必区分词法有效和无效 浮点数,这是很复杂的。定义也 允许您在任何位置拆分标识符,并得到两个 令牌,然后可以与'##'运算符一起粘贴。

预处理数字可能导致程序被误解为 。例如,0xE + 12是一个预处理号码,其中 不会转换为任何有效的数字常量,因此语法 错误。这并不意味着0xE + 12,这可能是你想要的 。