《Google C++编码规范》第六章:命名约定
一.通用命名约定(General Naming Rules)
函数命名,变量命名,文件命名应该就有描述性,不要过度缩写,类型和变量应该是名词,函数可以用“命令性”动词。
对于缩写,只有当放到项目外仍然非常明确,否则不要使用缩写:
int num_dns_connections;//dns是大部分人都明白的
也不要省略字母的缩写:
int error_count; //good
int error_cnt; //bad
二.文件命名(File Names)
文件名要全部小写,可以包含短线-
或下划线_
,按照项目约定来。可接受的命名:
my_useful_class.cc;
my-useful-class.cc;
myusefulclass.cc;
C++源文件以.cc
结尾,头文件以.h
结尾。对于Linux/Unix等系统而言,不要使用已经存在于/user/include下的文件名。
通常,尽量让文件名明确,http_server_logs.h
就比logs.h
要好,定义类时,头文件和源文件应该成对出现,例如:foo_bar.h
和foo_bar.cc
,对应类FooBar
。
如果内联函数比较短,(定义?)可以直接放在.h
中,如果代码较长,放在-inl.h
中,例如:
url_table.h //声明
url_table.cc //定义
url_table-inl.h //内联函数含有较多的代码的定义
三.类型命名(Type Names)
类型命名每个单词都以大写字母开头,不包含下划线:MyExctingClass
。
所有类型命名,包括类、结构体、类型定义(typedef)和枚举,使用上述相同的规则:
class UrlTable{};
typedef hash_map<UrlTable*, string> UrlTableMap;
enum UrlTableErrors {};
四.变量命名(Variable Names)
变量名一律小写,单词间以下划线相连,类的成员变量以下划线结尾:
string table_name; //good
string tableName; //bad
class UrlTables {
string first_url_; //good
string second_url; //bad
};
结构体的数据变量和普通变量一样,可以不以下划线结尾。
全局变量:少用,用的时候可以用g_
作为前缀来与局部变量区分。
五.常量命名(Constant Names)
所有常量命名:k接大写字母开头的单词,如:
const int kDaysInWeek = 7;
六.函数命名(Function Names)
普通函数以大写字母开头,每个单词的首字母大写,没有下划线:
DeleteUrl();
AddTableEntry();
存取函数要与存取的变量名匹配:
class MyClass {
public:
int num_entries() const { return num_entries_; }
int set_num_entries(int num_entris) {
num_entris_ = num_entris;
}
private:
int num_entries_;
}
其它短小的内联函数也可以使用小写字母。
七.命名空间(Namespace Names)
命名空间的名称时全部小写,命名基于项目名称和目录结构:google_awesome_project
八.枚举命名(Enumerator Names)
枚举值应该全部大写,单词间以下划线相连:MY_EXCITING_ENUM_VALUE
。
枚举名称属于类型,因此大小写混用:
enum UrlTableErrors {
OK = 0,
ERROR_OUT_OF_MEMORY,
ERROR_MALFORMED_INPUT,
};
九.宏命名(Macro Names)
通常是不使用宏的,一定要使用,命名要想枚举一样全部大写:
#define ROUND(x) ...
#define PI_ROUND 3.0
十.命名规则例外(Exception to Naming Rules)
当命名与C++实体相似的对象时,可参考现有的命名:
bigopen(); //函数名,参考open()
uint //typedef 类型定义
bigpos //struct 或class,参考pos
sparse_hash_map //STL 相似实体;参考STL 命名约定
LONGLONG_MAX //常量,类似INT_MAX