在C ++标准14([lex.ppnumber])的2.10节中,预处理数被定义为
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编号,这与下面第2.10节给出的解释相矛盾。
有没有我得不到的东西?
答案 0 :(得分:4)
引自here:
预处理数字有一个相当奇怪的定义。该类别包括所有正常的整数和浮点数常量 人们期待C,但也有许多其他事情可能没有 最初认为是一个数字。正式地,预处理数字开始 带有可选的句点,必需的十进制数字,然后继续 任何字母,数字,下划线,句号和 指数。指数是两个字符的序列'e +','e-','E +', 'E-','p +','p-','P +'和'P-'。 (以'p'开头的指数 或'P'是C99的新手。它们用于十六进制浮点 常数。)
这个不寻常的定义的目的是将预处理器与数字常量的完全复杂性隔离开来。它确实如此。 不必区分词汇有效和无效 浮点数,这很复杂。定义也 允许您在任何位置拆分标识符并获得两个标识符 令牌,然后可以与'##'运算符一起粘贴回来。
预处理数字可能导致程序成为可能 曲解。例如,0xE + 12是预处理数 不转换为任何有效的数字常量,因此是一种语法 错误。它并不意味着0xE + 12,这是你可能拥有的 意图。