签入预处理号
Sign in Preprocessing Number
在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节给出的解释相矛盾。
有什么我不明白的吗?
从这里引用:
预处理数有一个相当奇怪的定义。类别包括所有普通的整型和浮点型常量人们对C的期望,但也有一些其他的事情,人们可能不会最初被认为是一个数字。正式地,预处理数字开始使用可选的句点,所需的十进制数字,然后继续任意字母、数字、下划线、句号和指数。指数是两个字符序列' e+ ', ' e- ', ' e+ ',' E- ', ' p+ ', ' p- ', ' p+ '和' p- '。(以p开头的指数或' P '是C99的新成员。它们用于十六进制浮点数常数。)
这个不同寻常的定义的目的是将预处理器与数字常量的全部复杂性隔离开来。是的不必区分词法有效和无效浮点数,这很复杂。这个定义也是允许您在任何位置拆分标识符并恰好得到两个令牌,然后可以将其与' ## '操作符粘贴在一起。
预处理数字可能会导致程序出错误解。例如,0xE+12是一个预处理数不能转换为任何有效的数字常量,因此是语法错误。它不是指0xE + 12,这是你可能有的目的。
数字"实际上是一个有效的预处理数。你没有正确阅读语法所暗示的内容。一个数字,后面跟着一个非数字的标识符(在本例中是一个字母),后面跟着一个数字,这确实符合语法。
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- Xmllint未设置,而在路径中找不到XMLLINT;跳过XML预处理
- 如何在预处理时读取文件