空白字符是一个术语,指用于格式化目的的字符。在 C++ 中,这主要指空格、制表符和换行符。C++ 中的空格通常用于三件事:分隔某些语言元素、内部文本以及格式化代码。
某些语言元素必须以空格分隔
该语言的语法要求某些元素由空格分隔。当两个关键字或标识符必须连续放置时,通常会发生这种情况,以便编译器可以区分它们。
例如,变量声明必须以空格分隔:
int x; // int 和 x 必须有空格分开
如果我们intx
改为键入,编译器会将其解释为标识符,然后抱怨它不知道标识符intx
是什么。
另一个例子,函数的返回类型和名称必须以空格分隔:
int main(); // int 和 main 之间必须由空格分开
当需要空格作为分隔符时,编译器不关心使用了多少空格,只要存在一些空格即可。
以下变量定义都是有效的:
int x;
int y;
int
z;
在某些情况下,换行符用作分隔符。单行注释以换行符结束。
std::cout << "Hello world!"; // This is part of the comment and
this is not part of the comment
预处理器指令(例如#include <iostream>
)也必须放在单独的行上:
#include <iostream>
#include <string>
引号内的文本会将空白字符的数量视为字面值
在引号内的文本中,空白字符的数量会被视为字面值,也就是说,任何空格、制表符或换行符都会按照原样显示,不会被解释为空白。这对于保留文本格式或在字符串中包含代码示例等情况非常重要。
std::cout << "Hello world!";
不同于:
std::cout << "Hello world!";
引号内的文本中不允许换行:
std::cout << "Hello
world!"; // Not allowed!
被空白字符(空格、制表符或换行符)分隔的引号内文本会被连接起来:
std::cout << "Hello "
"world!"; // prints "Hello world!"
使用空格来格式化代码
否则,空白通常会被忽略。这意味着我们可以在任何想要格式化代码的地方使用空格,以便于阅读。
例如,以下内容很难阅读:
#include <iostream>
int main(){std::cout<<"Hello world";return 0;}
以下更好(但仍然相当密集):
#include <iostream>
int main() {
std::cout << "Hello world";
return 0;
}
而下面的就更好了:
#include <iostream>
int main()
{
std::cout << "Hello world";
return 0;
}
如果需要,语句可以分为多行:
#include <iostream>
int main()
{
std::cout
<< "Hello world"; // works fine
return 0;
}
这对于特别长的语句非常有用。
基本格式设置
与一些其他编程语言不同,C++不强制对程序员施加任何格式限制。因此,我们说C++是一种不受空白字符限制的语言。
这既有利又有弊。一方面,拥有自由度做任何你喜欢的事情是不错的。另一方面,多年来已经开发了许多不同的C++程序格式化方法,你会发现(有时是显著且分散注意力的)关于哪种方法最好存在不同意见。我们的基本经验法则是,最佳样式是产生最易读的代码并提供最一致性的样式。
以下是我们对基本格式的建议:
- 对于缩进,可以使用制表符(tabs)或空格(spaces)都可以(大多数集成开发环境都有设置选项,可以将制表符转换为适当数量的空格)。偏好使用空格的开发者之所以这样做,是因为它使格式化自我描述——使用空格缩进的代码始终看起来正确,不管使用的编辑器是什么。使用制表符的支持者则想知道为什么你不使用专门用于缩进的字符来进行缩进,尤其是因为你可以根据自己的喜好设置制表符宽度。在这里没有正确的答案——就像争论蛋糕和派哪个更好一样。最终取决于个人喜好。
无论哪种方式,我们建议您将制表符设置为 4 个空格的缩进。有些 IDE 默认缩进 3 个空格,这也很好。
- 函数大括号有两种可接受的样式。
Google C++ 风格指南建议将左大括号与语句放在同一行:
int main() {
}
这样做的理由是它减少了垂直空白的数量(你不需要将一整行用于只有左大括号的情况),因此可以在屏幕上容纳更多代码。在屏幕上显示更多代码使程序更易于理解。
然而,我们更喜欢常见的替代方式,即左大括号出现在自己的一行上:
int main()
{
}
这样做增强了可读性,并且更不容易出错,因为你的大括号成对出现时应始终缩进相同的级别。如果由于大括号不匹配而导致编译器错误,很容易看出问题出在哪里。
- 大括号内的每个语句应从它所属函数的左大括号开始缩进一个制表符。例如:
int main()
{
std::cout << "Hello world!\n"; // 缩进一个制表符(4个空格)
std::cout << "Nice to meet you.\n"; // 缩进一个制表符(4个空格)
}
- 每行代码的长度不应过长。通常,每行代码的最大长度被认为是80个字符。如果一行代码要超过这个长度,应该将其分成多行(在合适的位置)。可以通过在每行代码前面添加额外的制表符来实现这一点,或者如果多行代码相似,也可以将其与上面的行对齐(以便更容易阅读)。
int main()
{
std::cout << "This is a really, really, really, really, really, really, really, "
"really long line\n"; // one extra indentation for continuation line
std::cout << "This is another really, really, really, really, really, really, really, "
"really long line\n"; // text aligned with the previous line for continuation line
std::cout << "This one is short\n";
}
这样做可以使你的代码更容易阅读。在现代宽屏显示器上,它还允许你将两个具有相似代码的窗口并排放置,更容易进行比较。
考虑将每行代码长度保持在80个字符或更少。
许多编辑器都有一个内置功能(或插件/扩展),可以在给定列(例如 80 个字符)处显示一行(称为“列指南”),因此您可以轻松地看到行何时变得太长。要查看您的编辑器是否支持此功能,请搜索您的编辑器名称+“Column guide”。
- 如果使用运算符(例如 << 或 +)分割长行,则该运算符应放置在下一行的开头,而不是当前行的末尾
std::cout << 3 + 4
+ 5 + 6
* 7 * 8;
这有助于更清楚地表明后续行是前一行的延续,并允许您将运算符对齐到左侧,从而更容易阅读。
- 使用空格可以对齐值或注释或在代码块之间添加间距,从而使代码更易于阅读。
更难读:
cost = 57;
pricePerItem = 24;
value = 5;
numberOfItems = 17;
更容易阅读:
cost = 57;
pricePerItem = 24;
value = 5;
numberOfItems = 17;
更难读:
std::cout << "Hello world!\n"; // cout lives in the iostream library
std::cout << "It is very nice to meet you!\n"; // these comments make the code hard to read
std::cout << "Yeah!\n"; // especially when lines are different lengths
更容易阅读:
std::cout << "Hello world!\n"; // cout lives in the iostream library
std::cout << "It is very nice to meet you!\n"; // these comments are easier to read
std::cout << "Yeah!\n"; // especially when all lined up
更难读:
// cout lives in the iostream library
std::cout << "Hello world!\n";
// these comments make the code hard to read
std::cout << "It is very nice to meet you!\n";
// especially when all bunched together
std::cout << "Yeah!\n";
更容易阅读:
// cout lives in the iostream library
std::cout << "Hello world!\n";
// these comments are easier to read
std::cout << "It is very nice to meet you!\n";
// when separated by whitespace
std::cout << "Yeah!\n";
强烈建议您使用与我们的示例相同的样式。它已经过数千名程序员超过数十亿行代码的实际测试,并针对成功进行了优化。
一个例外:如果您在其他人的代码库中工作,请采用他们的风格。优先考虑一致性比优先考虑自己的偏好更好。
在现有项目中工作时,请与已采用的风格保持一致。
自动格式化
大多数现代 IDE 将帮助您在键入代码时格式化代码(例如,当您创建函数时,IDE 将自动缩进函数体内的语句)。
但是,当您添加或删除代码、更改 IDE 的默认格式或粘贴具有不同格式的代码块时,格式可能会变得混乱。修复部分或全部文件的格式可能会让人头疼。幸运的是,现代 IDE 通常包含自动格式化功能,可以重新格式化所选内容(用鼠标突出显示)或整个文件。
对于 Visual Studio 用户
在 Visual Studio 中,自动格式化选项可以在“编辑”>“高级”>“格式化文档”和“编辑”>“高级”>“格式选择”下找到。
对于 Code::Blocks 用户
在 Code::Blocks 中,可以在右键单击 > 使用 AStyle 格式化下找到自动格式化选项。
还有一些外部工具可用于自动格式化代码。clang-format是一种流行的格式。
强烈建议使用自动格式化功能,以保持代码的格式化风格一致。
原创文章,作者:jkhxw,如若转载,请注明出处:https://www.jkhxw.com/cpp-whitespace-and-basic-formatting/