与其他一些语言不同,C++不对程序员强制执行任何格式化限制。因此,我们说C++是一个空白符无关的语言。 这既是好事也是坏事。一方面,能够自由行事是很好的。另一方面,多年来已经发展出许多不同的C++程序格式化方法,你会发现(有时是显著且分散注意力的)关于哪些是最好的争论。我们的基本规则是,最好的风格是产生最易读代码并提供最大一致性的风格。
缩进与制表符使用
空白符是指用于格式化目的的字符。在C++中,这主要指的是空格、制表符和换行符。C++中的空白符通常用于三件事:分隔某些语言元素、文本内部以及代码格式化。 某些语言元素必须用空白符分隔 语言的语法要求某些元素必须用空白符分隔。这主要发生在两个关键字或标识符必须连续放置时,以便编译器可以区分它们。 例如,变量声明必须用空白符分隔:
int x; // int和x之间必须用空白符分隔
如果我们输入intx
,编译器会将其解释为一个标识符,然后抱怨它不知道标识符intx
是什么。
另一个例子是,函数的返回类型和名称必须用空白符分隔:
int main(); // int和main之间必须用空白符分隔
当需要用空白符作为分隔符时,编译器不在乎使用了多少空白符,只要存在即可。 以下变量定义都是有效的:
int x;
int y;
int
z;
在某些情况下,换行符用作分隔符。单行注释由换行符终止。 例如,这样做会给你带来麻烦:
std::cout << "Hello world!"; // 这是注释的一部分,而
这是注释之外的部分
预处理指令(例如#include <iostream>
)必须放在单独的行上:
#include <iostream>
#include <string>
引用文本中的空白符按字面量处理 在引用文本内部,空白符的数量是按字面量处理的。
std::cout << "Hello world!";
与以下不同:
std::cout << "Hello world!";
引用文本中不允许有换行符:
std::cout << "Hello
world!"; // 不允许!
只由空白符(空格、制表符或换行符)分隔的引用文本将被连接:
std::cout << "Hello "
"world!"; // 打印 "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"; // 完全没问题
return 0;
}
这对于特别长的语句很有用。 基本格式化 与其他一些语言不同,C++不对程序员强制执行任何格式化限制。因此,我们说C++是一个空白符无关的语言。 这既是好事也是坏事。一方面,能够自由行事是很好的。另一方面,多年来已经发展出许多不同的C++程序格式化方法,你会发现(有时是显著且分散注意力的)关于哪些是最好的争论。我们的基本规则是,最好的风格是产生最易读代码并提供最大一致性的风格。 以下是我们对基本格式化的建议:
使用制表符或空格进行缩进是可以的(大多数IDE都有一个设置,可以将制表符按键转换为适当数量的空格)。喜欢空格的开发人员这样做是因为无论使用哪个编辑器或设置,它都能确保代码精确对齐。使用制表符的支持者想知道为什么你不用为缩进而设计的字符进行缩进,特别是你可以将宽度设置为你个人的偏好。这里没有正确答案——争论这个问题就像争论蛋糕和派哪个更好一样。归根结底,这取决于个人偏好。
无论如何,我们建议你将制表符设置为相当于4个空格的缩进。一些IDE默认为3个空格的缩进,这也是可以的。
大括号风格
函数大括号有两种常规风格。
许多开发人员更喜欢将开括号放在与语句同一行:
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"; // 为续行增加一个额外的缩进
std::cout << "This is another really, really, really, really, really, really, really, "
"really long line\n"; // 文本与前一行对齐以续行
std::cout << "This one is short\n";
}
这使得你的行更容易阅读。在现代宽屏显示器上,它还允许你将两个具有相似代码的窗口并排放置,更容易进行比较。
最佳实践 考虑保持你的行长度在80个字符或更少。
提示 许多编辑器都有内置功能(或插件/扩展),会在给定的列(例如80个字符)显示一条线(称为"列指南"),这样你就可以很容易地看到你的行是否太长。要查看你的编辑器是否支持这一点,请搜索你的编辑器名称+“列指南”。
操作符位置与空白符使用
如果长行用操作符(例如«或+)分割,操作符应该放在下一行的开头,而不是当前行的末尾
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位于iostream库中
std::cout << "It is very nice to meet you!\n"; // 这些注释使代码难以阅读
std::cout << "Yeah!\n"; // 特别是当行的长度不同时
更易阅读:
std::cout << "Hello world!\n"; // cout位于iostream库中
std::cout << "It is very nice to meet you!\n"; // 这些注释更容易阅读
std::cout << "Yeah!\n"; // 特别是当全部对齐时
更难阅读:
// cout位于iostream库中
std::cout << "Hello world!\n";
// 这些注释使代码难以阅读
std::cout << "It is very nice to meet you!\n";
// 特别是当全部堆在一起时
std::cout << "Yeah!\n";
更易阅读:
// cout位于iostream库中
std::cout << "Hello world!\n";
// 这些注释更容易阅读
std::cout << "It is very nice to meet you!\n";
// 通过空白符分隔
std::cout << "Yeah!\n";
格式化风格与一致性
我们将在本教程中遵循这些约定,它们将成为你的第二天性。当我们向你介绍新主题时,我们将介绍与这些功能相匹配的新风格建议。 最终,C++赋予你选择你最舒适的风格或认为最好的风格的权力。然而,我们强烈建议你使用我们示例中的风格。它已经经过数千名程序员在数十亿行代码中的实战测试,并且被优化以取得成功。 一个例外:如果你在别人的基础上工作,采用他们的风格。一致性比个人喜好更好。
最佳实践 在现有项目中工作时,与已经采用的风格保持一致。
自动格式化工具
大多数现代IDE会在你输入代码时帮助你格式化代码(例如,当你创建一个函数时,IDE会自动缩进函数体内的语句)。 然而,当你添加或删除代码,或更改IDE的默认格式化,或粘贴具有不同格式化的代码块时,格式化可能会变得混乱。修正部分或全部文件的格式化可能是一件令人头痛的事情。幸运的是,现代IDE通常包含一个自动格式化功能,可以重新格式化选定的部分(用鼠标高亮显示)或整个文件。
各IDE的自动格式化选项
对于Visual Studio用户 在Visual Studio中,自动格式化选项可以在"编辑">“高级”>“格式化文档"和"编辑”>“高级”>“格式化选定内容"下找到。
对于Code::Blocks用户 在Code::Blocks中,自动格式化选项可以在右键点击>格式化使用AStyle下找到。
为了更容易访问,我们建议添加一个键盘快捷键来自动格式化活动文件。 还有一些外部工具可以用来自动格式化代码。clang-format是一个受欢迎的。
最佳实践 强烈建议使用自动格式化功能以保持你的代码格式化风格的一致性。
风格指南
风格指南是一个简洁、有见地的文件,包含(有时是任意的)编程约定、格式化指南和最佳实践。风格指南的目标是确保项目中的所有开发人员以一致的方式编程。