软件开发:实体抽象为虚拟体,复杂庞大的逻辑区分依赖规则的建立。运用命名规则来搭建框架,会使整个软件系统框架,有更清晰的可读性和可维护性。
1.同一性
在编写一个子模块或者派生类的时候,需要遵循其基类或整体模块的命令风格,保持命令风格在整体模块的同一性。
2.标识符组成--单词
标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确。
3.最小化长度&&最大化信息量原则
在保持一个标识符明确意思的同时,应该尽量缩短其长度。
4.避免过于相似
不要出现紧靠大小写区分的标识符,例如“i”与“I”,“function”与“Function”等。
5.避免在不同级别的作用域的重名
程序中不要出现名字完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法的错误,但是容易使人误解。
6.正确命名具有互斥意义的标识符
用正确的反义词命名具有互斥意义的标识符,如:“nMinValue"和"nMaxValue”,"GetName()“和"SetName()”
7.避免名字出现数字编号
尽量避免名字出现数字的编号,如Value0、Value1、Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋从而导致了产生无意义的名字(因为用数字编号最省事)。
除了异常类等个别情况(不希望用户把类看作一个普通的、正常类的情况)外,C++类结构的命名一般应该遵循以下准则
1.C++类/结构的命名
类的名字都要以大写的字母“C”开头,后跟一个或多个单词。为便于界定,每个单词的首字母需要大写。
2.推荐的组织形式
类的命名推荐用“名词”或者“形容词+名词”的形式,例如:“CAnalyzer”、“CFVecteor” …
1.传统的C的命名规则
传统C结构体的名称全部由大写字母组成,单词间使用下划线界定,例如:“SERVICE_STATUS”,“DRIVER_INFO”…
1.函数的命名
函数的名称由一个或者多个单词组成。便于界定,每个单词的首字母要大写。
推荐的组织形式 函数名应该使用“动词”或者“动词+名词”(动宾词组)形式。例如:“GetName()”、“SetName()”、“Erase()”、“Reserve()”…
2.保护成员函数
保护成员函数的开头应当加上一个下划线“_“以示区分,例如”_SetState()”…
3.私有成员函数
类似地,私有成员函数的开头应当加上两个下划线“__”,例如“__DestroyImp()”…
虚函数 虚函数习惯用"Do"开头,如:“DoRefresh()”,"_DoEncryption()"…
4.回调和事件处理函数
回调和事件处理函数习惯以单词"On"开头。例如:"_OnTimer()",“OnExit()”
变量应该是程序中使用最多的标识符了,变量的命名规范可能是一套C++命名准则中最重要的部分。
1.变量的命名
变量名由作用于前缀+类型的缀+一个或多个单词组成。为了便于界定,每个单词的首字母要大写。对于某些用途简单明了的局部变量,也可以使用简化的方式,如:i,j,k,x,y,z...
2.作用域前缀
作用域前缀标明了一个变量的可见范围。作用域可以有以下几种:
前缀 说明
无 局部变量
m_ 类的成员变量(member)
sm_ 类的静态成员变量(static member)
s_ 静态变量(static)
g_ 外部全局变量(global)
sg_ 静态全局变量(static global)
sg_ 静态全局变量(static global)
gg_ 进程间共享的数据段全局变量(global global)
除非不得已,否则应该尽可能少用全局变量。
3.类型的缀
前缀 说明
n 整型和位域变量(number)
e 枚举型变量(enumeration)
c 字符型变量(char)
b 布尔型变量(bool)
f 浮点型变量(float)
p 指针型变量和迭代子(pointer)
pfn 特别针对指向函数指针变量和函数指针(pointer of function)
g 数组(grid)
i 类的实例(instance)对于经常用到的类,也可以定义一些专门的前缀,如:std::string和std::wstring类的前缀可以定义为"st",std::vector类的前缀可以定义为"v"等等
类型的缀可以组合使用,例如"gc"表示字符数组,"ppn"表示指向整型的指针的指针等等。
4.推荐的组成形式
变量的名字应当使用"名词"或者"形容词+名词"。例如:"nCode","m_nState","nMaxWidth"...
C++引入了对常量的支持,常量的命名规则如下:
1.常量的命名规则
常量名由类型前缀+全大写字母组成,单词间通过下划线来界定,如cDELIMITER,nMAX_BUFFER…类型前缀的定义和变量命名规则中的相同。
枚举、联合以及typdef的命名 枚举、联合以及typedef语句生成的类型名全都是大写字母组成,单词间通过下划线界定,如:FAR_PROC,ERROR_TYPE…
宏、枚举值的命名 宏和枚举值全大写字母组成,单词通过下划线界定,如:ERROR_UNKNOWN,OP_STOP…
函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串。用来指明函数的定义或原型。LINK程序或其它工具有时须要指定函数的名字修饰来定位函数的正确位置。
还有一种须要指定函数的 名字修饰的情况是在汇编程序中调用C或C++的函数。
对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其參数的字节数。比如 _functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀。比如_functionname。 __fastcall调用约定在输出函数名前加上一个“@”符号。后面也是一个“@”符号和其參数的字节数,比如 @functionname@numbe
C++的函数名修饰规则有些复杂。可是信息更充分,通过分析修饰名不仅可以知道函数的调用方式。返回值类型,參数个数甚至參数类型。无论 __cdecl,__fastcall还是__stdcall调用方式,函数修饰都是以一个“?”開始,后面紧跟函数的名字。再后面是參数表的開始标识和 依照參数类型代号拼出的參数表。
对于__stdcall方式,參数表的開始标识是“@@YG”,对于__cdecl方式则是“@@YA”。对于 __fastcall方式则是“@@YI”。參数表的拼写代号例如以下所看到的:
X--void
D--char
E--unsigned char
F--short
H--int
I--unsigned int
J--long
K--unsigned long(Dword)
M--float
N--double
_N--bool
U--struct
....
指针的方式有些特别。用PA表示指针,用PB表示const类型的指针。
后面的代号表明指针类型。假设同样类型的指针连续出现,以“0”取代,一 个“0”代表一次反复。U表示结构类型。通常后跟结构体的类型名,用“@@”表示结构类型名的结束。函数的返回值不作特殊处理,它的描写叙述方式和函数參数一 样。紧跟着參数表的開始标志,也就是说。函数參数表的第一项实际上是表示函数的返回值类型。參数表后以“@Z”标识整个名字的结束。假设该函数无參数,则 以“Z”标识结束。
注:
有两种方式能够检查你的程序中的函数的名字修饰:使用编译输出列表或使用Dumpbin工具。使用/FAc,/FAs或/FAcs命令行參数能够让编译器 输出函数或变量名字列表。使用dumpbin.exe /SYMBOLS命令也能够获得obj文件或lib文件里的函数或变量名字列表。
此外。还能够使用 undname.exe 将修饰名转换为未修饰形式
本文参考CSDN博主「卡图卢斯」的文章和yxysuanfa的文章,其链接为:https://blog.csdn.net/u014647208/article/details/84103204和https://www.cnblogs.com/yxysuanfa/p/6984895.html