C++谷歌命名法

本文主要记录易于理解,通用的C++命名规则,此记。

一般命名规则

命名需要尽量是描述性的,避免缩写(特殊情况除外,比如特别常见的缩写num)。

1
2
3
4
int price_count_reader;    // 没有缩写
int num_errors; // "num" 是常用的惯例
int num_dns_connections; // 大多数人都知道“DNS”代表什么
int lstm_size; // "LSTM" 在机器学习中是常用的缩写

!!!!!下面是不推荐的命名方法!!!!!!!!!

1
2
3
4
5
6
7
int n;                     // 毫无意义的名字.
int nerr; // 模糊的缩写.
int n_comp_conns; // 模糊的缩写.
int wgc_connections; // 估计只有你们自己人知道这是代表什么.
int pc_reader; // 很多东西可以简写为"pc".
int cstmr_id; // 删除了一些中间的字母.
FooBarRequestInfo fbri; // 这甚至都不是一个单词.

一些众所周知,比较常用的缩写是可以的,比如i表示迭代变量,T表示模板参数。

命名规则

类型 命名规则 可用特殊符号 举例
文件名 都是小写字母,可以用下划线“”和破折号“-”,如果没有习惯写法,一般用下划线“ “_”和“-” my_useful_class.cc, my_useful_class.h
类型名 类型名以大写字母开头,以下划线开始 类型名包括:classes, structs, type aliases, enums, and type template parameters ,MyExcitingClass, MyExcitingEnum.
变量名(一般变量名) 小写字母,单词之间加下划线 “_” a_local_variable
变量名(类成员变量名) 小写字母,单词之间加下划线,词尾加下划线 “_” a_class_data_member_
变量名(结构体数据成员名) 小写字母,单词之间加下划线(或单个单词) “_” a_struct_data_member, name,pool
常数命名 常数或常量表达式,需要以小写字母“k”开头,后加大写字母开头的单词,在大写字母无法区分的时候可以添加下划线 “k”,“_” kAndroid8_0_0, kDaysInAWeek
函数名 常规函数名以大写字母开头,访问函数和赋值函数可以像一般变量命名规则一样 访问函数和赋值函数“_” AddTableEntry(),访问函数和赋值函数:int count() , void set_count(int count)
命名空间 都是小写字母,最上层的命名空间是基于项目名称的,需要避免和常用的命名空间产生歧义 websearch
枚举类型名 枚举类型(for both scoped and unscoped enums)参考常数或者宏定义命名规则 “_” kEnumName 或者 ENUM_NAME
宏定义名 宏定义一般不要用,如果必须要用那么应该用全全大写字母,以破折号“_”间隔 “_” MY_MACRO_THAT_SCARES_SMALL_CHILDREN_AND_ADULTS_ALIKE

文件名

  • my_useful_class.cc
  • my-useful-class.cc
  • myusefulclass.cc
  • myusefulclass_test.cc // _unittest and _regtest are deprecated.

    类型名

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     // classes and structs
    class UrlTable { ...
    class UrlTableTester { ...
    struct UrlTableProperties { ...

    // typedefs
    typedef hash_map<UrlTableProperties *, string> PropertiesMap;

    // using aliases
    using PropertiesMap = hash_map<UrlTableProperties *, string>;

    // enums
    enum UrlTableErrors { ...

变量名

一般变量名

1
2
3
4
string table_name;  // OK - uses underscore.
string tablename; // OK - all lowercase.

string tableName; // Bad - mixed case.

类成员变量名

1
2
3
4
5
6
7
class TableInfo {
...
private:
string table_name_; // OK - underscore at end.
string tablename_; // OK.
static Pool<TableInfo>* pool_; // OK.
};

结构体数据成员名

1
2
3
4
5
struct UrlTableProperties {
string name;
int num_entries;
static Pool<UrlTableProperties>* pool;
};

常数命名

1
2
const int kDaysInAWeek = 7;
const int kAndroid8_0_0 = 24; // Android 8.0.0

函数名

1
2
3
AddTableEntry()
DeleteUrl()
OpenFileOrDie()

特殊的访问函数或赋值函数

1
2
int count()
void set_count(int count)

命名空间

1
2
3
websearch::index
websearch::index_util
websearch::index::frobber_internal for use in frobber.h

枚举类型名

1
2
3
4
5
6
7
8
9
10
enum UrlTableErrors {
kOK = 0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
enum AlternateUrlTableErrors {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};

宏定义名

宏定义一般不要用,如果必须要用那么应该用全大写和下划线间隔

1
2
#define ROUND(x) ...
#define PI_ROUNDED 3.0

命名规则之外

如果你需要对一些C++已有命名规则之外的对象命名,可以参考现有的命名规则。

1
2
3
4
5
6
7
8
9
10
bigopen()
function name, follows form of open()
uint
typedef
bigpos
struct or class, follows form of pos
sparse_hash_map
STL-like entity; follows STL naming conventions
LONGLONG_MAX
a constant, as in INT_MAX
如果我的文章对你有所帮助,那么不妨?