文件后缀名
实现:.cc
声明:.h(模板声明和定义都写在.h里)
内联:.inc(不允许有-inl.h,也就是声明和定义写在一起)或者用于插入文本
实现和声明一一对应,除非如单元测试和只包含main函数的可以只有.cc。
目录
头文件
一个.h文件应该自给自足,其自身就应该include所有其他依赖头文件,并不要求定义任何特别symbols。
除了为模板提供实例化的模板函数需要定义在实例化改模板的.cc文件里。
-
define
- 头文件应该有#define保护来防止被多重包含,名字的格式是<PROJECT><PATH><FILE>H,全部都要大写。
- 1
- 使用:
#ifndef 名字
#define 名字
...
#endif
-
前置声明
- 尽量避免使用前置声明。只在需要避免循环嵌套的时候使用。一般来说前置声明是用来定义一个指针,用于避免重复编译。
-
内联函数
- 只有函数少于10行且不是折构,不包含循环和switch才应该内联。虚函数一般也不内联。
类内部的函数会自动内联。
-
include
- 头文件顺序:相关头文件,C库,C++库,其他库的.h,本项目的.h。并按照字典序排序,每个大部分用空行隔开。
- 路径格式:项目完整路径
- 包含的头文件:实现文件只需要包含.h,其他文件包含一切直接用到的名字的头文件,即便这个头文件被包含在其他头文件内,除非其他头文件明确表示会提供这个名字
- 例外:需要特殊宏判断的可以放在最后面。
YuleFox
标准化函数参数顺序可以提高可读性和易维护性(对函数参数的堆栈空间有轻微影响, 我以前大多
是相同类型放在一起);
作用域
-
命名空间
- 只在局部作用域中声明命名空间别名
- 禁止使用using指示
- 禁止使用内联命名空间
- 不再std中声明任何东西
格式:
- 除了gflags(谷歌的写的一个更方便在命令行给程序传入参数的库),头文件和类的前置声明以外的所有部分都应该被包含于一个命名空间中。命名空间内部内容不因为命名空间而缩进。
- 在命名空间右大括号后注释上namespace name(会自动补全)
- 命名空间的命名可以根据绝对或相对路径
-
匿名命名空间和静态变量
- 在.cc中定义不需要被外部引用的对象时,建议使用匿名命名空间或声明为static。但不要在.h中使用。
-
非成员函数、静态成员函数和全局函数
- 尽量不要用裸的全局函数,尽量单独形成编译单元
- 静态成员函数应该与静态数据成员高度相关,不要用来当做限定作用域的非成员函数
- 非成员函数,不依赖于外部变量,应该被放于命名空间中
- 当一个静态成员函数被超过一个编译单元(cpp文件)所使用,可以考虑将其提取到新类中。
-
局部变量
- 局部变量限定于最小可能的作用域内,并在变量声明时进行初始化。if,while,for语句中需要的变量就在语句中声明即可,并且会在语句的作用域内可用。
- 例外:如果变量是一个对象,并且每次进出作用域都要调用折构和构造函数,那么不如定义在外层。