背景
最近用C++写一个小工具,顺便总结了一个c++代码风格。不拒绝匈牙利命名,但不制造匈牙利命名!^_^
代码风格
具体来说,只是列出了命名的约定。其它参考Google C++ Style Guide。
通用规则
General Naming Rules
命名尽量见名知义,不用莫名其妙的缩写,名称能传递更多的信息,好过写再多注释。
驼峰一般只大写单词的首字母,包括缩写词,比如RPC和ID。
大驼峰,写StartRpc
,不要写StartRPC
。
大驼峰,写UserId
,不要写UserID
。
小驼峰,写userId
,不要写userID
。
用众所周知的变量,例如迭代变量i
和模板参数T
。
类
Type Names
大驼峰,无下划线。
类、结构体、枚举、类模板参数、类型别名。
1
2
3
| class MyClass {};
struct MyStruct {};
enum class MyEnum {};
|
1
2
| typedef hash_map<UrlTableProperties *, std::string> PropertiesMap;
using PropertiesMap = hash_map<UrlTableProperties *, std::string>;
|
变量
Variable Names
全小写,下划线。
一般维基中有列出的缩写,可以用,比如fqdn。
1
| std::string fqdn; //Fully Qualified Domain Name
|
1
| std::string table_name;
|
类数据成员,末尾加下划线。
Google大概是想着不用写this->table_name = table_name
这样的语句,可以直接写table_name_ = table_name
了。
1
2
3
4
5
6
| class TableInfo {
...
private:
std::string table_name_;
static Pool<TableInfo>* pool_;
};
|
结构体数据成员,结尾不加下划线。
1
2
3
4
5
| struct UrlTableProperties {
std::string name;
int num_entries;
static Pool<UrlTableProperties>* pool;
};
|
函数
Function Names
常规函数大驼峰。
访问器和修改器(get和set函数)可以像变量一样命名,void set_count(int count)
。小驼峰也行,保持一致就行,void setCount(int count)
。
1
2
3
4
| MyFunction()
AddTableEntry()
DeleteUrl()
OpenFileOrDie()
|
1
2
| int count();
void set_count(int count);
|
常量
Constant Names
变量前面加小写字母k,其它部分大驼峰。
为什么是k
, 不是c
,constant
?
通常的c
表示char
,C
表示class
,所以用了konstant
,这是个德语词,参考stackoverflow。
其实这也算是一种匈牙利命名,Google这么做我想是为了从命名上把常量跟宏区分开吧。
1
2
| const int kDaysInAWeek = 7;
const int kAndroid8_0_0 = 24; // Android 8.0.0
|
宏
Macro Names
全大写,下划线。
1
2
| #define MY_NAME yanyong
#define PI_ROUNDED 3.14
|
枚举常量
Enumerator Names
同宏或常量的命名规则,更喜欢用宏的习惯,全大写加下划线。
最后一个元素可以加逗号,
,也可以不加逗号,最好统一加上,我想元素在格式上的一致可以更好地生成吧,详情参考stackoverflow,数组好像也是如此。
1
2
3
4
5
| enum class UrlTableError {
kOk = 0, //kOk两个k都是小写字母
kOutOfMemory,
kMalformedInput,
};
|
1
2
3
4
5
| enum class AlternateUrlTableError {
OK = 0,
OUT_OF_MEMORY = 1,
MALFORMED_INPUT = 2,
};
|
enum class
和enum
的区别,首选enum class
。 参考stackoverflow。
对枚举作用域限定,不会隐式转换。
1
2
3
| enum class Color1 { RED, GREEN, BLUE, };
enum class Color2 { RED, GREEN, BLUE, };
int x = static_cast<int>(Color1::RED);
|
编译通过。
1
2
| enum Color { RED, GREEN, BLUE, };
int x = RED;
|
编译错误。
1
2
3
| enum Color1 { RED, GREEN, BLUE, };
enum Color2 { RED, GREEN, BLUE, };
int x = RED;
|
例外
Exceptions to Naming Rules
如果正在命名类似于现有C/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
|
参考
Google C++ Style Guide
中文版开源地址