学习自Google C++编程规约
通用命名规则
函数命名, 变量命名, 文件命名要有描述性; 少用缩写.
int price_count_reader; // 无缩写配合下划线
int num_errors; // "num" 是一个常见的写法
int num_dns_connections; // 人人都知道 "DNS" 是什么
文件命名
C++文件要以.cc
结尾.头文件以 .h
结尾 (其实cpp更常见)
文件名要全部小写, 可以包含下划线 (_)
或连字符 (-)
, 依照项目的约定. 如果没有约定, 那么 “_”
更好.
例如:
-
my_useful_class.cc
-
http_server_logs.h
-
定义类时文件名一般成对出现, 如
foo_bar.h
和foo_bar.cc
, 对应于类FooBar
. -
不要使用已经存在于
/usr/include
下的文件名 (Yang.Y 注: 即编译器搜索系统头文件的路径), 如db.h
.
类型命名
类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass,MyExcitingEnum
.
所有类型命名—— 类, 结构体, 类型定义 (typedef
), 枚举, 类型模板参数 —— 均使用相同约定, 即以大写字母开始, 每个单词首字母均大写, 不包含下划线. 例如:
// 类和结构体
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
// 类型定义
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
// using 别名
using PropertiesMap = hash_map<UrlTableProperties *, string>;
// 枚举
enum UrlTableErrors { ...
变量命名
- 变量 (包括函数参数) 和数据成员名一律小写, 单词之间用下划线连接.
- 类的成员变量以下划线结尾, 但结构体的不用
如: a_local_variable
, a_struct_data_member
, a_class_data_member_
.
/**
* 普通变量命名
*/
string table_name; // 好 - 用下划线.
string tablename; // 好 - 全小写.
string tableName; // 差 - 混合大小写(这种写法褒贬不一)
/**
* 类数据成员
* 不管是静态的还是非静态的, 类数据成员都可以和普通变量一样, 但要接下划线.
*/
class TableInfo {
...
private:
string table_name_; // 好 - 后加下划线.
string tablename_; // 好.
static Pool<TableInfo>* pool_; // 好.
};
/**
* 结构体变量
* 不管是静态的还是非静态的, 结构体数据成员都可以和普通变量一样, 不用像类那样接下划线:
*/
struct UrlTableProperties {
string name;
int num_entries;
static Pool<UrlTableProperties>* pool;
};
常量命名
声明为 constexpr
或 const
的变量,或在程序运行期间其值始终保持不变的, 命名时以 “k” 开头, 大小写混合.
例如:const int kDaysInAWeek = 7;
说明
所有具有静态存储类型的变量 (例如静态变量或全局变量, 参见 存储类型) 都应当以此方式命名.
对于其他存储类型的变量, 如自动变量等, 这条规则是可选的. 如果不采用这条规则, 就按照一般的变量命名规则.
函数命名
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配 :
MyExcitingFunction()
, MyExcitingMethod()
, my_exciting_member_variable()
, set_my_exciting_member_variable()
.
AddTableEntry()
DeleteUrl()
OpenFileOrDie()
取值和设值函数的命名与变量一致. 一般来说它们的名称与实际的成员变量对应, 但并不强制要求. 例如 int count() 与 void set_count(int count).
宏命名
通常不应该使用宏. 如果不得不用, 其命名像枚举命名一样全部大写, 单词之间使用下划线:
#define PI_ROUNDED 3.0
枚举命名
枚举的命名应当和 常量 或 宏 一致: kEnumName
或是 ENUM_NAME
.
单独的枚举值应该优先采用 常量 的命名方式. 但 宏 方式的命名也可以接受. 枚举名 UrlTableErrors
(以及 AlternateUrlTableErrors
) 是类型, 所以要用大小写混合的方式.
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
2009 年 1 月之前, 我们一直建议采用 宏 的方式命名枚举值. 由于枚举值和宏之间的命名冲突, 直接导致了很多问题. 由此, 这里改为优先选择常量风格的命名方式. 新代码应该尽可能优先使用常量风格. 但是老代码没必要切换到常量风格, 除非宏风格确实会产生编译期问题.
命名空间命名
命名空间以小写字母命名. 最高级命名空间的名字取决于项目名称. 要注意避免嵌套命名空间的名字之间和常见的顶级命名空间的名字之间发生冲突.
命名规则的特例
如果你命名的实体与已有 C/C++ 实体相似, 可参考现有命名策略.
bigopen()
: 函数名, 参照 open()
的形式
uint
: typedef
bigpos
: struct
或 class
, 参照 pos
的形式
sparse_hash_map
: STL 型实体; 参照 STL 命名约定
LONGLONG_MAX
: 常量, 如同 INT_MAX
欢迎交流学习,共同进步
限本人水平有限,如有错误请指教,谢谢