没有合适的资源?快使用搜索试试~ 我知道了~
首页Google C++编程风格指南:权威严谨的开源项目规范
Google C++编程风格指南:权威严谨的开源项目规范
需积分: 10 2 下载量 133 浏览量
更新于2024-07-09
收藏 594KB PDF 举报
"《Google C++ Style Guide》是由Google官方发布的编程风格指南,旨在提供一套统一、严谨的编码标准,以减少代码审查中的混淆并提高团队协作效率。这份长达5万字的文档详细地涵盖了C++编程的最佳实践,包括代码组织、命名约定、注释风格、内存管理、异常处理等多个方面,体现了Google对于代码质量的高要求。 该指南强调规则的合理性与权威性,它不仅仅是一份列举具体规则的清单,更是一个经过深思熟虑的过程的体现。每一条规则的背后都有明确的理由和权衡,让开发者理解为什么要这样做,何时可以例外,以及如何在不同场景下做出最佳选择。尽管它主要针对Google主导的开源项目,但对于其他团队来说,也提供了有价值的参考和启示,帮助他们构建适合自己团队特性和项目的编码规范。 翻译团队在翻译过程中力求保持严谨,清华大学的同学@lilinsanity和acgtyrant等人分别在2015年对此进行了重要的修订和完善,特别是对C++11的新特性进行了更新和翻译。整个翻译工作于2015年8月完成,并且遵循ArtisticLicense/GPL开源许可,允许用户自由使用和分享。 这份指南的中文版不仅保留了原文的深度和专业性,还融入了译者的理解和见解,使得读者能够更好地理解和应用。虽然翻译可能存在一些不足,但作者鼓励读者提出反馈,共同提升中文版的质量。《Google C++ Style Guide》是C++程序员提升编程技艺、遵循业界最佳实践的重要参考资料。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/33215315/bgc.jpg)
如果你必须定义非成员函数, 又只是在 .cc 文件中使用它, 可使用匿名 namespaces‘或 ‘‘static‘ 链接关键字
(如 static int Foo() {...}) 限定其作用域.
2.4.
Tip: 将函数变量尽可能置于最小作用域内, 并在变量声明时进行初始化.
C++ 允许在函数的任何位置声明变量. 我们提倡在尽可能小的作用域中声明变量, 离第一次使用越近越好. 这使
得代码浏览者更容易定位变量声明的位置, 了解变量的类型和初始值. 特别是,应使用初始化的方式替代声明再赋值,
比如:
int i;
i = f(); // 坏——初始化和声明分离
int j = g(); // 好——初始化时声明
vector<int> v;
v.push_back(1); // 用花括号初始化更好
v.push_back(2);
vector<int> v = {1, 2}; // 好——v 一开始就初始化
注意, GCC 可正确实现了 for (int i = 0; i < 10; ++i) (i 的作用域仅限 for 循环内), 所以其他 for 循环中
可以重新使用 i. 在 if 和 while 等语句中的作用域声明也是正确的, 如:
while (const char* p = strchr(str, ‘/’)) str = p + 1;
Warning: 如果变量是一个对象, 每次进入作用域都要调用其构造函数, 每次退出作用域都要调用其
析构函数.
// 低效的实现
for (int i = 0; i < 1000000; ++i) {
Foo f; // 构造函数和析构函数分别调用 1000000 次!
f.DoSomething(i);
}
在循环作用域外面声明这类变量要高效的多:
Foo f; // 构造函数和析构函数只调用 1 次
for (int i = 0; i < 1000000; ++i) {
f.DoSomething(i);
}
2.5.
![](https://csdnimg.cn/release/download_crawler_static/33215315/bgd.jpg)
Tip: 禁止使用 class 类型的静态或全局变量:它们会导致难以发现的 bug 和不确定的构造和析构函数调用顺序。
不过 constexpr 变量除外,毕竟它们又不涉及动态初始化或析构。
静态生存周期的对象,即包括了全局变量,静态变量,静态类成员变量和函数静态变量,都必须是原生数据类型
(POD : Plain Old Data): 即 int, char 和 float, 以及 POD 类型的指针、数组和结构体。
静态变量的构造函数、析构函数和初始化的顺序在 C++ 中是不确定的,甚至随着构建变化而变化,导致难以发
现的 bug. 所以除了禁用类类型的全局变量,我们也不允许用函数返回值来初始化 POD 变量,除非该函数不涉及
(比如 getenv() 或 getpid())不涉及任何全局变量。(函数作用域里的静态变量除外,毕竟它的初始化顺序是有明确
定义的,而且只会在指令执行到它的声明那里才会发生。)
同理,全局和静态变量在程序中断时会被析构,无论所谓中断是从 main() 返回还是对 exit() 的调用。析构顺
序正好与构造函数调用的顺序相反。但既然构造顺序未定义,那么析构顺序当然也就不定了。比如,在程序结束时某
静态变量已经被析构了,但代码还在跑——比如其它线程——并试图访问它且失败;再比如,一个静态 string 变量也
许会在一个引用了前者的其它变量析构之前被析构掉。
改善以上析构问题的办法之一是用 quick_exit() 来代替 exit() 并中断程序。它们的不同之处是前者不会执行
任何析构,也不会执行 atexit() 所绑定的任何 handlers. 如果您想在执行 quick_exit() 来中断时执行某 handler
(比如刷新 log),您可以把它绑定到 _at_quick_exit(). 如果您想在 exit() 和 quick_exit() 都用上该 handler, 都
绑定上去。
综上所述,我们只允许 POD 类型的静态变量,即完全禁用 vector (使用 C 数组替代) 和 string (使用 const
char [])。
如果您确实需要一个 class 类型的静态或全局变量,可以考虑在 main() 函数或 pthread_once() 内初始化一个
指针且永不回收。注意只能用 raw 指针,别用智能指针,毕竟后者的析构函数涉及到上文指出的不定顺序问题。
Note: Yang.Y 译注:
上文提及的静态变量泛指静态生存周期的对象, 包括: 全局变量, 静态变量, 静态类成员变量, 以及函数静态变量.
(YuleFox)
1. cc 中的匿名名字空间可避免命名冲突, 限定作用域, 避免直接使用 using 关键字污染命名空间;
2. 嵌套类符合局部使用原则, 只是不能在其他头文件中前置声明, 尽量不要 public;
3. 尽量不用全局函数和全局变量, 考虑作用域和命名空间限制, 尽量单独形成编译单元;
4. 多线程中的全局变量 (含静态成员变量) 不要使用 class 类型 (含 STL 容器), 避免不明确行为导致的 bug.
5. 作用域的使用, 除了考虑名称污染, 可读性之外, 主要是为降低耦合, 提高编译/执行效率.
acgtyrant
1. 注意「using 指示(using-directive)」和「using 声明(using-declaration)」的区别。
2. 匿名名字空间说白了就是文件作用域,就像 C static 声明的作用域一样,后者已经被 C++ 标准提倡弃用。
3. 局部变量在声明的同时进行显式值初始化,比起隐式初始化再赋值的两步过程要高效,同时也贯彻了计算机体
系结构重要的概念「局部性(locality)」。
4. 注意别在循环犯大量构造和析构的低级错误。
![](https://csdnimg.cn/release/download_crawler_static/33215315/bge.jpg)
3.
类是 C++ 中代码的基本单元. 显然, 它们被广泛使用. 本节列举了在写一个类时的主要注意事项.
3.1.
Tip: 不要在构造函数中进行复杂的初始化 (尤其是那些有可能失败或者需要调用虚函数的初始化).
定义:
在构造函数体中进行初始化操作.
优点:
排版方便, 无需担心类是否已经初始化.
缺点:
在构造函数中执行操作引起的问题有:
• 构造函数中很难上报错误, 不能使用异常.
• 操作失败会造成对象初始化失败,进入不确定状态.
• 如果在构造函数内调用了自身的虚函数, 这类调用是不会重定向到子类的虚函数实现. 即使当前没有
子类化实现, 将来仍是隐患.
• 如果有人创建该类型的全局变量 (虽然违背了上节提到的规则), 构造函数将先 main() 一步被调用,
有可能破坏构造函数中暗含的假设条件. 例如, gflags 尚未初始化.
结论:
构造函数不得调用虚函数, 或尝试报告一个非致命错误. 如果对象需要进行有意义的 (non-trivial) 初始化,
考虑使用明确的 Init() 方法或使用工厂模式.
3.2.
Tip: 如果类中定义了成员变量, 则必须在类中为每个类提供初始化函数或定义一个构造函数. 若未声明构造函数, 则
编译器会生成一个默认的构造函数, 这有可能导致某些成员未被初始化或被初始化为不恰当的值.
定义:
new 一个不带参数的类对象时, 会调用这个类的默认构造函数. 用 new[] 创建数组时, 默认构造函数则总
是被调用. 在类成员里面进行初始化是指声明一个成员变量的时候使用一个结构例如 int _count = 17
或者 string _name{"abc"} 来替代 int _count 或者 string _name 这样的形式.
优点:
用户定义的默认构造函数将在没有提供初始化操作时将对象初始化. 这样就保证了对象在被构造之时就处
于一个有效且可用的状态, 同时保证了对象在被创建时就处于一个显然” 不可能” 的状态, 以此帮助调试.
缺点:
对代码编写者来说, 这是多余的工作.
如果一个成员变量在声明时初始化又在构造函数中初始化, 有可能造成混乱, 因为构造函数中的值会覆盖
掉声明中的值.
剩余66页未读,继续阅读
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
anjiantest
- 粉丝: 0
- 资源: 7
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 中国微型数字传声器:技术革新与市场前景
- 智能安防:基于Hi3515的嵌入式云台控制系统设计
- 手机电量低时辐射真增千倍?解析手机使用谣言
- 56F803型DSP驱动的高精度大功率超声波电源控制策略研究
- ARM与GPRS结合的远程监测系统设计
- GPS与RFID技术结合的智能巡检系统设计
- CPLD驱动的低功耗爆炸场温度测试系统设计
- 基于FPGA的智能驱动控制系统:可扩展设计与工业网络协议
- 基于ATmega128和CH374的嵌入式USB接口设计
- 基于AT89C52的温度补偿超声波测距仪:高精度设计与应用
- MSP430F448单片机在交流数字电压表中的应用
- 提升变频器应用效率的12项实用技巧
- STM32F103在数字电镀电源并联均流系统中的应用
- PSpice仿真下的升压开关电源设计:拓扑分析与CCM稳定性提升
- 轻巧高效:MSP430主导的低成本无线传感器网络节点设计
- FPGA在EDA/PLD中实现LVDS接口的应用解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)