C++编程规范与风格备忘——命名
程序员文章站
2022-03-31 09:37:32
...
我正在使用的“C++编程规范与风格”主要参考谷歌、华为、微软与NASA,现整理一下以备忘。
1、通用命名规则
- 名称应该具有意义,能反映其作用,通常不要简化;
- 仅在缩写名称是公认、明确无岐义的情况下才使用,否则一律不使用缩写;
- 不得使用汉语拼音;
- 不要使用字母、数字、下划线之外的符号;
- 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等;例如:add/remove begin/end create/destroy
- 尽量避免名字中出现数字编号,除非逻辑上的确需要编号;
- 标识符前不应添加模块、项目、产品、部门的名称作为前缀;
- 重构或修改部分代码时,应保持和原有代码的命名风格一致。
2、文件
- 文件名统一使用小写字母。这是因为不同操作系统对文件名大小写的处理上有区别,windows系列忽略大小写,Linux则区分大小写,所以干脆统一使用小写。
- 构成文件名的单词间使用下划线来连接。
- C++源文件使用.cpp结尾,头文件使用.h结尾。
- 定义类的文件一般成对出现,文件名称与类名称相对应,例如类AnalyticalModel,与之对应的文件分别为:analytical_model.h与analytical_model.cpp。
3、类
每个单词以大写字母开头,不使用下划线。结构、typeof与枚举也使用相同的命名规则。示例:
// classes and structs
class UrlTable { ...
class UrlTableTester { ...
struct UrlTableProperties { ...
// typedefs
typedef hash_map<UrlTableProperties *, string> PropertiesMap;
// enums
enum UrlTableErrors { ...
类的实例,也就是对象的命名与变量的命名规则相同。
4、变量
- 一律使用小写字母,单词间用下划线相连。类成员变量以下划线结尾。例如:
initial_position
initial_position_
- 结构的数据成员与普通变量命名规则一样,但不用在结尾添加下划线。例如:
struct TimeType {
IntType year;
IntType month;
IntType day;
IntType hour;
IntType minute;
RealType second;
};
- 全局变量使用“g_”前缀,但通常情况下禁止使用全局变量。
- 静态变量使用“s_”前缀。
- 禁止使用单个字母作为变量名,但允许定义i、j、k作为局部循环变量。
- 不得使用匈牙利命名法。因其有碍代码重构。
- 使用“名词”或“形容词+名词”的方式命名变量。
5、常量
字母全部大写,单词间用下划线连接。例如:
const int MINIMUM_NUMBER_OF_BYTES = 4;
应避免使用#define语句。应该使用const变量或枚举类型代替常量宏。(一个例外是当包含条件调试时可以使用#define语句)。
6、方法/函数
- 每个方法和函数都执行一个动作,因此名称应明确其作用。名称应为动词,并以大写开头的混合大小写形式。例如:
OutputCalibrationData()
Normalize()
- 推荐前缀:
– Is/Has/Can:问一些问题并返回布尔类型
– Set/Get
– Initialize:初始化一个对象
– Compute:计算一些东西(简单的),或者使用下面的
– Calculate:计算一些东西(复杂的) - 类的名称不应在方法名称中重复。例如:
Vector Normalize() // NOT: Vector NormalizeVector()
- 内联函数可以使用小写字母与下划线组合的方式命名。见下一条的示例。
- 存取函数(accessors and mutators)要与存取的变量名匹配。例如:
class MyClass {
public:
...
int num_entries() const { return num_entries_; }
void set_num_entries(int num_entries) { num_entries_ = num_entries; }
private:
int num_entries_;
};
- C函数使用小写字母与下划线组合的方式命名。例如:
get_best_fit_model()
load_best_estimate_model()
C++程序中使用C函数的情况很少,仅用于C++和C代码之间的接口。
7、方法/函数参数
- 命名规则与变量一样。
- 传递类时,参数的名称可与其类型名称相同。但是,这不是必需的,在某些情况下甚至可能很麻烦。在这种情况下,名称应简洁。例如:
void SetForceModel(ForceModel *forceModel)
void SetForceModel(ForceModel *fm)
8、命名空间
命名空间的名称全小写,用下划线连接,其命名基于项目名称和目录结构。例如:google_awesome_project。
9、枚举
命名规则与类相同。枚举值应全部大写,单词间以下划线相连,例如:
enum DayName {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY};
enum Color {RED = 3; BLUE, DARK_BLUE, GREEN, DARK_GREEN, YELLOW = 7};
枚举值可以用类型名称作为前缀。例如:
enum Color {COLOR_RED, COLOR_GREEN, COLOR_BLUE};
10、宏定义
字母全部大写,用下划线连接,例如:
#define PI_ROUNDED 3.0
MY_EXCITING_ENUM_VALUE