Debian维护了一套C++代码风格规范,本质上是让代码读起来更一致、更清晰。这不仅仅是写给别人看的,更是写给未来的自己看的。下面聊聊几个核心要点,都是实践中经常遇到的。

1. 命名约定
命名这件事,说大不大,说小不小,但好的命名能省下大量沟通成本。Debian的建议是:
- 类名,用大驼峰(Pascal Case)——比如
MyClass,一眼就能看出是类型。 - 函数和变量,用小驼峰(camelCase)——像
myMethod、myVariable,这样在阅读代码时,能快速区分哪些是类型、哪些是实例。 - 常量,全部大写,单词间用下划线——比如
const double PI = 3.14159265358979323;,这已经是行业惯例了。 - 私有数据成员,加
m_前缀——例如m_width、m_height,这个前缀能明确告诉你:这是类内部的状态,不是临时变量。 - 函数参数,加
t_前缀——比如t_inputValue,这样在函数体内,参数和局部变量就不会混淆了。 - 需要注意,避免使用下划线
_开头,因为编译器或标准库可能会保留这些名字,容易引发冲突。
2. 代码格式规范
格式是代码的门面,也是团队协作的基础。Debian推荐的做法比较务实:
- 缩进,统一用4个空格,不用Tab。这个理由很简单:不同编辑器对Tab的显示宽度不一致,4个空格能保证在任何地方看到的样子都一样。
- 空格使用也有讲究:
- 关键字与左括号之间加空格,比如
if (、for (,读起来更宽敞。 - 函数名与左括号之间不加空格,比如
myFunction(),这是最自然的写法。 - 逗号后面加空格,像
func(arg1, arg2),这样参数列表不会挤在一起。 - 二元或三元运算符两侧加空格,比如
a + b、a ? b : c,优先级一目了然。 - 大括号内部两侧不加空格,比如
if (condition) {,保持紧凑。
- 关键字与左括号之间加空格,比如
- 大括号的放置:函数的大括号,左括号放在函数名下一行开头,右括号单独成行;其他结构(比如
if、for、while)的左括号紧跟语句末尾,右括号单独成行。这种区分很实用,函数体通常比较长,换行更能看清结构。 - 行长度,建议不超过80字符。有些项目允许到120,但超过的话,最好在低优先级操作符后换行,操作符留在行尾,新行对齐同类元素。
3. 特殊符号与关键字规范
一些细节用好了,能让代码更安全、更清晰:
- 空指针,统一用
nullptr,而不是0或NULL。这是C++11引入的类型安全空指针,能避免很多隐式类型转换问题。 - 注释,单行注释用
//,避免用/* */,因为后者在嵌套注释时容易出错。 auto关键字,适合简化局部变量的类型声明,比如auto it = vec.begin();。但不要滥用,全局变量或类成员还是尽量显式声明类型,保证可读性。
4. 代码组织规范
项目结构清晰,能让构建和协作更顺畅:
- 构建生成的文件(比如
.o、.a、可执行文件)应该放在单独的目录(比如build/),不要和源代码混在一起。这是常见的实践,能避免误删代码文件。 - 团队项目最好统一前缀或后缀,比如
debian_这样,保持项目结构整齐。
5. 其他重要规范
这些是实践中容易踩坑的地方,值得单独提一下:
- 变量初始化,所有变量在使用前都必须初始化。比如
int count = 0;或std::string name;。未初始化的变量是未定义行为,C++在这方面尤其严厉。 - 函数设计,保持短小精悍,每个函数只做一件事。比如
calculateSum()只负责求和,不包含输入输出逻辑。这既是设计原则,也是维护成本的关键。 const的使用,尽量用const修饰不变量(比如const int MAX_SIZE = 100;)、函数参数(比如void printValue(const std::string& value))和成员函数(比如int getValue() const)。这能提高代码的安全性,也能让阅读者更放心。- 模板的使用,不要过度复杂。多层嵌套或特化会大幅增加维护难度。优先使用标准库容器(比如
std::vector、std::map),简单明确,大家都能看懂。