一、头文件
1、除了单元测试、main之外每一个cpp文件都有对应的h文件
2、#define保护格式<PROJECT>_<PATH>_<FILE>_H_,例如proj/src/path/file.h采用#ifndef PROJ_PATH_FILE_H_
3、前置声明代替#include。a:成员变量声明为Foo *或Foo &;b:函数参数、返回值类型,静态数据成员的类型为类Foo的
4、-inl.h文件:复杂的内联函数定义在后缀名为-inl.h的头文件中。
5、函数参数顺序:输入参数在前,输出参数在后。
6、保函头文件顺序(例如在project/src/base/logging.cpp中):
#include "base/logging.h"(优先位置)
C系统文件
C++系统文件
其他库头文件
本项目内头文件
二、作用域
1、命名空间(不太熟):尽量不要使用using来污染命名空间
2、使用命名空间中的“非成员函数”、“静态函数”,而不是“全局函数”。.cpp文件中暂用的可以用“不具名命名空间”或者static关联(如static int foo(){...})。
3、禁止class类型全局变量(全局变量只能是内建类型),多线程中禁止非常数全局变量,禁止使用函数返回值初始化全局变量。类静态成员变量也被视作全局变量。
三、类
1、构造函数:只做没意义的动作,有意义的放到Init()方法中;要提供默认构造;将关键字 explicit 加到单参数极造函数前防止隐式转换。
2、不需要拷贝时应使用 DISALLOW_COPY_AND_ASSIGN。
// 禁止使用拷贝极造函数和赋值操作的宏
// 应在类的 private:中使用
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)
class Foo {
public:
Foo(int f); ~Foo();
private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
3、仅当只有数据时使用 struct,其它一概使用 class。
4、使用组合通常比使用继承(只用公共继承)更适宜。C++实践中,继承主要用于实现继承(implementation inheritance),子类继承父类的实现代码;接口继承(interface inheritance),子类仅继承父类的方法名称。
5、接口以Interface为后缀
6、尽量少重载操作符
7、存取控制。私有化成员变量foo_,定义取值函数foo()、赋值函数set_foo(),可内联
8、定义次序如下:public:、protected:、private:,如果那一块没有,直接忽略即可。每一块中,声明次序一般如下:
1) typedefs 和 enums;
2) 常量;
3) 构造函数;
4) 析构函数;
5) 成员函数,含静态成员函数;
6) 数据成员,含静态数据成员。
宏 DISALLOW_COPY_AND_ASSIGN 置亍 private:块最后,作为类的最后部分。
四、C++特性
1、智能指针用scoped_ptr。STL容器中使用shared_ptr。禁止使用auto_ptr
2、按引用传递的参数必须加上 const。事实上这是一个硬性约定:输入参数为值或常数引用,输出参数为指针;输入参数可以是常数指针,但不能使用非常数引用形参。
3、禁止使用缺省函数参数。禁止使用变长数组和alloca。
4、合理使用友元。可以将FooBuilder、单元测试类声明为Foo的友元。
5、不要使用C++异常。
6、禁止使用运行时类型识别(RTTI)(就是反射吧~)
7、类型转换用static_cast<>(), const_cast, reinterpref_cast, 不要用dynamic_cast。
8、尽量用printf()系列函数代替流,只在记录日志式使用流。
9、用++i/--i代替i++/i--。
10、能用const的时候就用const。
11、整型只使用C++中 的int,不要用short/long等,用<stdint.h>中的int16_t等代替。不要使用 uint32_t 等无符号整型,除非你是在表示一个位组(bit pattern)而不是一个数值。
12、64位友好
1)printf的格式要特殊处理,参考原文
2) sizeof(void *) != sizeof(int)。用intptr_t获得指针大小的整数。
3) gcc用__attribute__((packed))设置结构体对齐方式。
4)64位常量用LL或ULL为后缀,如0x1234LL,3ULL。
5)可以用宏 #ifdef _LP64 判断64位系统。
13、谨慎用宏,尽量用内联函数、枚举和常量代替。
14、Use 0 for integers, 0.0 for reals, NULL for pointers, and '\0' for chars.
15、尽量用 sizeof(varname) 代替 sizeof(type) 。
五、命名约定
1、通用命名规则:函数命名、变量命名、文件命名应具有描述性,不要要过度缩写,类型和变量应该是名词,函数名可以用“命令性”动词。
2、文件名:全部小写,可以包含_或-。如my_usefull_class.cpp。
3、类型名:大写字母开头的驼峰式,不含下划线,如MyClass。所有类型名(类/结构体/类型定义(typedef)/枚举)都适用。
4、变量名:一律小写,单词间以下划线相连(my_exciting_local_variable)。类的成员发量以下划线结尾(my_exciting_member_variable_),全局变量g_开头,常量k开头驼峰式(kDaysInAWeek)。
5、函数名:普通函数大写开头的驼峰式(AddTableEntry()),存取函数与变量名匹配(int num(), void set_num()),短小的可以内联的函数可以使用小写字母。
6、命名空间:全小写,下划线分隔,基于项目名称和目录结构。
7、枚举值名:全大写,下划线分隔(MY_EXCITING_ENUM_VALUE)。
8、宏命名:最好不用,用的话同枚举值命名。
六、注释
这是一门艺术
七、格式
1、每行不超过80字符
2、尽量不用非ASCII字符,必须用时用utf-8格式
3、2个空格作为缩进(这个4个比较好?)
4、函数声明的排版也是艺术
5、其他排版问题也是艺术,尽量提高可读性
八、最最重要的
团队合作,保持一致。没有最好的个人,只有最好的团队。
分享到:
相关推荐
### Google C++ 开发规范指南知识点解析 #### 一、头文件规范 - **自包含头文件**:每个头文件应包含...以上内容涵盖了Google C++开发规范指南中的主要知识点,遵循这些指导原则有助于编写高质量、可维护的C++代码。
Google的Cpp编码规范中文版是一份详尽的编程指南,旨在为C++开发者提供一套统一且高质量的编程标准。这份规范不仅涵盖了代码风格、命名规则、错误处理、内存管理等方面,还深入探讨了如何写出高效、可读性强且易于...
**谷歌C++编码规范中文版**是一份历史悠久但依然具有高度参考价值的开发文档,它为C++程序员提供了一套详尽的编程指导原则和最佳实践。这份规范旨在提高代码的可读性、可维护性以及团队之间的协作效率。虽然这份规范...
Google-CPP 编程规范旨在提高代码的质量和可维护性,遵循这些规则可以帮助开发者编写出高效、清晰且易于维护的C++代码。通过实践这些规范,不仅可以提升个人编程能力,还能为团队带来更高质量的软件产品。
### 谷歌C++代码规范详解 #### 一、概述 C++作为一种广泛应用的编程语言,在软件开发中扮演着重要角色。为了提高代码质量、可读性和维护性,谷歌制定了一套详细的C++编码规范。这套规范不仅适用于C++初学者,也对...
- **cpplint**:使用cpplint工具来检查代码是否符合Google C++编程规范。 ##### 2.6 Other C++ Features (其他C++特性) - **Reference Arguments**:传递引用作为参数可以避免不必要的复制。 - **Function ...
### Google C++编程规范中文版知识点详述 #### 一、背景 Google C++编程规范是一份详尽的文档,旨在指导开发人员编写高质量、可维护的C++代码。这份文档由Google内部多位资深工程师共同制定,是C++开发者的重要...
- Google Test提供了丰富的测试助手类和函数,如`std::string`和`std::vector`的比较器,简化了测试代码的编写。 8. **测试输出** - 测试结果会以XML格式输出,便于与其他持续集成工具集成,如Jenkins、Travis CI...
- `test`:测试代码目录,使用单元测试框架(如Google Test)进行代码验证。 - `build`:编译产出物存放目录,如二进制文件、编译中间文件等。 - `docs`:文档目录,存放项目相关的markdown或Doxygen自动生成的...
### Google C++ Style Guide中文版知识点详述 #### 背景 Google C++ Style Guide是一份由Google制定并公开发布的C++编程规范文档。该文档由Benjy Weinberger、Craig Silverstein、Gregory Eitzmann、Mark Mentovai...
"Google+C++编程规范.pdf"应当是这份规范的PDF版,方便开发者打印或电子阅读。同时,"google-cpp-style-zh[1]"可能是该规范的中文翻译版本,对于中文使用者来说更加友好。 C++函数库中的关键部分包括: 1. **STL...
Proto2cpp通过Python编程语言实现,简化了将protobuf元数据转化为易于理解和维护的文档的过程。 Google Protocol Buffers是一种高效的数据序列化协议,广泛应用于跨平台的数据交换。它允许开发者定义数据结构,然后...
8. **代码风格与规范**:良好的编码习惯和代码风格对于任何程序员都是必要的,CppStarter可能会提供一些基本的编码规范。 9. **持续集成**:对于更高级的学习者,可能会介绍如何将CMake与持续集成工具(如Jenkins、...
【Protocol Buffer(简称ProtoBuf)开发者指南 - 非官方不完整版】 Protocol Buffer是一种强大的、跨语言的数据序列化协议,由Google开发。它提供了一种高效、灵活且语言无关的方式来处理结构化数据,用于通信协议...
### LIBKML 入门与示例代码详解 #### 一、LIBKML 简介 LIBKML 是一个用 C++ 编写的库,主要用于处理 KML(Keyhole Markup Language)数据格式。该库支持 Linux、Mac OS X 和 Windows 平台,并且提供了丰富的功能来...
- **代码风格与规范**:遵循C++标准库的编码风格,提高代码可读性。 - **单元测试**:学习如何编写和使用测试框架,如Google Test,确保代码质量。 - **调试技巧**:使用GDB或其他调试工具,查找和修复程序中的...
4. **测试文件(test_*.cpp)**:可能使用了诸如Google Test或Catch等测试框架,编写测试用例来验证代码功能。 5. **Makefile**:用于编译和链接项目的脚本,简化了构建过程。 6. **README.md**:可能包含项目介绍...
13. **代码规范**:遵循良好的编程实践,如C++ Core Guidelines,有助于提高代码可读性和维护性。 14. **软件工程**:项目可能包含项目管理文件,如Makefile(对于非IDE构建)或解决方案文件(对于VS2019),用于...
C++ 是一种广泛使用的系统级和应用级编程语言,其复杂性和灵活性要求代码规范尤为重要,ufmt 正好能满足这种需求。 使用 ufmt,开发者不再需要手动调整每行代码的缩进、空格或换行,只需简单地在终端中输入命令,...