C++学习笔记:
2. 代码风格(本文)
3. 安全性
4. 可维护性
5. 可移植性及多线程
6. 性能
7. 正确性和脚本
代码风格
代码风格最重要的是一致性,其次是遵循C++程序员习惯的阅读风格。
C++允许任意长度的标识符名称,因此在命名时没必要非要保持简洁,建议使用描述性名称,并在风格上保持一致。
-
CamelCase
(驼峰命名法) -
snake_case
(蛇形命名法)
这两种是很常见的命名规范,snake_case
的优点是,在需要的时候可以适配拼写检查器。
建立代码风格指南
无论建立什么样的代码风格指南,一定要实现指定期望风格的.clang-format
文件。虽然这对命名没有帮助,但对于开源项目来说,保持一致的风格尤为重要。
许多IDE、编辑器都支持内置的clang-format,或者可以很方便的通过加载项安装。
-
VSCode: Microsoft C/C++ extension for VS Code[2]
-
CLion: ClangFormat as alternative formatter
-
VisualStudio: ClangFormat[3]
-
Resharper++: Using Clang-Format[4]
-
Vim
-
Format your C family code[5]
-
vim-autoformat[6]
-
-
XCode: ClangFormat-Xcode[7]
通用C++命名约定
-
类以大写字母开头:
MyClass
。 -
函数和变量以小写字母开头:
myMethod
。 -
常量全部大写:
const double PI=3.14159265358979323
。
C++标准库(以及其他著名C++库,如Boost[8])使用以下指导原则:
-
宏使用大写和下划线:
INT_MAX
。 -
模板参数名使用驼峰命名法:
InputIterator
。 -
所有其他名称都使用蛇形命名法:
unordered_map
。
区分私有对象数据
使用m_
前缀命名私有数据,以区别于公共数据,m_
代表“member(成员)”数据。
区分函数参数
最重要的是保持代码库的一致性,这是一种有助于保持一致性的方式。
使用t_
前缀命名函数参数,t_
可以被认为是“the”,但其可以表示任意含义,关键是要将函数参数与作用域内的其他变量区分开来,同时遵循一致的命名策略。
可以为团队选择任何前缀或后缀,下面是一个例子,提出了一个有争议的建议,相关讨论见issue #11[9]。
struct Size
{
int width;
int height;
Size(int t_width, int t_height) : width(t_width), height(t_height) {}
};
// This version might make sense for thread safety or something,
// but more to the point, sometimes we need to hide data, sometimes we don't.
class PrivateSize
{
public:
int width() const { return m_width; }
int height() const { return m_height; }
PrivateSize(int t_width, int t_height) : m_width(t_width), m_height(t_height) {}
private:
int m_wid