C++的命名规范

C++的实践中存在多种多样的命名方法。选择一种逻辑自洽的方案并实施到自己的开发中是一件令人愉快的事。

一、匈牙利命名法

这是一套完整的命名体系,包含一系列规则,VC++采用这种命名规则。windows API、MFC等,在Windows中一切(也有一些例外:如ISO规定的标准库)与C++有关的技术,均采用匈牙利命名法。unix的东西常常被追捧(例如:vim、Emacs,即使它们已经太过古老),Windows常常莫名其妙的被鄙视。不知是否受了Windows的拖累,这种命名方法受到了不少批评。我感觉这种批评多依据不足,甚至站不住脚。如果希望研究一下匈牙利命名法,参看百度百科:匈牙利命名法。

二、Google Style Guides

Google Style Guides 包含C++规范,这个C++规范中包含关于命名规范的介绍,为了方便我在下文称为Google Style Guides命名规范。在unix或跨平台项目中,匈牙利命名法显得那么格格不入,Google Style Guides命名规范更有unix范。下面介绍Google Style Guides命名规范,同时介绍了我没有遵守的地方,我没有遵守的地方使用斜体文字表达。在下文也介绍了驼峰命名法和帕斯卡命名法,虽然看似这两种是与匈牙利命名法齐名的,但前者分别只代表一条规则,并非一套体系,所以只作为Google Style Guides命名规范的一部分介绍。

1、通用

命名一个标识符时,一般不使用缩写,除非这个缩写是C++的惯例用法(for语句中表示索引的i)或行业内的惯用缩写(如GPS)。出于某些原因,在项目中我有时不遵守这个规则,比如有些不太好的缩写在项目中已经广泛使用等等。

对于多个单词组成的标识符,常采用首字母大写的方式分割每个单词。很多专有名词或缩写的英文是全大写,比如RPC、GPS。Google的建议是在作为标识符一部分时首字母大写,例如:StartRpc()。我习惯保持全大写,例如StartRPC();

CamelCase(驼峰命名法):多个单词构成一个标识符时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母,例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。PascalCase(帕斯卡命名法):与CamelCase相比这种命名方法的标识符首字母大写,其他与CamelCase一样,例如:SomeClass、SomeStruct。

2、文件名称

Google建议的命名方法是:文件名使用小写字母,以'_'或'-'分割每个单词(‘_’和‘-’不可在一个文件名中混用)。一个公司或项目最好约定统一用'_'或'-'。如果没有这种约定,优先选择‘_’分割。扩展名使用.cc和.h。避免与操作系统、标准库、编译器提供的头文件重名。避免名称过于通用,例如:http_server_log.h优于log.h。

由于visual studio采用的规则与Google的建议不同。我采用PascalCase。扩展名使用.cpp和.h。一个类与同名的文件名匹配class SomeClass<==>SomeClass.h SomeClass.cpp。

3、类型名称

类、结构体、枚举、类型别名、模板类型参数(classes, structs, type aliases, enums, and type template parameters)采用PascalCase。

4、变量名称

变量(variables (including function parameters) and data members)命名方法:小写并使用‘_‘分割单词。对于类(非结构体)的成员变量在变量名后加'_'。例如:local_variable,struct_data_member,class_data_member_。

5、常量名称

Google建议的命名方法是:PascalCase加上前缀k。例如:const int kDaysInAWeek = 7; 在罕见的情况下,可能无法实现用大写字母分割单词可以采用'_'。例如:const int kAndroid8_0_0 = 24; // Android 8.0.0

我没有遵守这条规则,我一般把变量的命名法应用到常量上。

6、函数名称

这里的函数包含全局函数和类方法。函数采用PascalCase。

除此之外Google还建议在为访问器和赋值器命名时采用变量的命名方式,并与变量的命名相对应。例如:变量int count_的存、取器命名为,void set_count(int count);int count();。

因为访问器和赋值器无论从概念上还是本质上都是函数,如果以变量方式命名,容易让人把它与变量混淆,所以函数我一律采用PascalCase。

7、宏

宏的命名方法:全大写,并且使用'_'分割单词。因为预处理器在不进行语法分析的前提下进行替换,如果宏的名称与其他标识符重名,将一律进行替换。所以采用这种奇怪的命名方法,最大限度的避免重名。在有替代方案的情况下,通常你不应该使用宏。

我认同Google的建议,希望最小限度的使用宏,我常常感到宏的使用给调试带来的障碍。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41855721/article/details/82292333