登录预处理数量
问题描述:
在第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节给出的解释相矛盾。
有什么事我不明白?
答
here从引用:
甲预处理数具有相当奇异定义。类别包括所有正常的整数和浮点常量 一个希望的C,也有一些其他的事情之一可能无法 最初承认的数字。在形式上,预处理号码开始 带有可选的句点,一个必需的十进制数字,然后用任何字母,数字,下划线,句号和 指数序列继续 。指数是两个字符序列'e +','e-','E +', 'E-','p +','p-','P +'和'P-'。 (以“P” 或“P”开头的指数是新的C99。它们用于十六进制浮点 常量。)
这个不寻常的定义的目的是给预处理从全隔离数字常量的复杂性。它确实 不必区分词法有效和无效 浮点数,这是很复杂的。定义也 允许您在任何位置拆分标识符,并得到两个 令牌,然后可以与'##'运算符一起粘贴。
预处理数字可能导致程序被误解为 。例如,0xE + 12是一个预处理号码,其中 不会转换为任何有效的数字常量,因此语法 错误。这并不意味着0xE + 12,这可能是你想要的 。
'1E3'是一个有效的pp号码。 'E'使用标识符非数字制作。 –