背景

最近用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, 不是cconstant?

通常的c表示charC表示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 classenum的区别,首选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

中文版开源地址