c++ 中是否允许以下代码?
a. foo()
(注意“foo”前面的空格)
我认为不会,但编译器不会抱怨。
是的,它是有效的 C++ 代码:
来自 C++ 标准 - ANSI ISO IEC 14882 2003.pdf,第 2.6 章:
有五种标记:标识符、关键字、文字、运算符和其他分隔符。如下所述,空白、水平和垂直制表符、换行符、换页符和注释(统称为“空白”)将被忽略,除非它们用于分隔标记。
同一章定义标点符号也是记号。
第2.12 章操作符和标点符号定义.
了标点符号。
应该没问题,据我所知,编译器会删除所有空格(制表符、换行符、空格),除非它们在字符串中(即“在字符串中”)。
[编辑] 你也不应该在运算符中放置空格(即i++
不同于i+ +
和foo()
不同于fo o()
)。
[编辑] 正如另一个答案中提到的,空格(空格、制表符、换行符、注释)也用于分隔运算符,例如void bar()
vs.voidbar()
允许。
.
只是运算符,如+
、::
、->
等&&
。
在您的情况下,空格被忽略
一般来说,词法分析器从源文件生成标记后删除的空格。
在 C 或 C++ 中的任何标记之前或之后的任何位置都可以有尽可能多或尽可能少的空格。唯一的规则是标记需要由不同的标记(即,不是字母(AZ、az、_)或数字的东西)分隔 [并且在相关的情况下,标记还可以包含 .、+ 或 -,例如作为浮点数)。
所以
a.foo()
a. foo();
a . foo ( ) ;
a
.
foo
(
)
;
都是一样的。
但是你必须在某些标记之间有一个空格,特别是那些只包含“字母和数字”的标记(见上文):
voidfoo()
不一样
void foo();