您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++命名规则详解

时间:2019-09-16 09:22:09  来源:  作者:

 

软件开发:实体抽象为虚拟体,复杂庞大的逻辑区分依赖规则的建立。运用命名规则来搭建框架,会使整个软件系统框架,有更清晰的可读性和可维护性。

一、命令的整体原则

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” …

三、C语言结构体的命名

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…类型前缀的定义和变量命名规则中的相同。

七、枚举、联合、typedef

枚举、联合以及typdef的命名 枚举、联合以及typedef语句生成的类型名全都是大写字母组成,单词间通过下划线界定,如:FAR_PROC,ERROR_TYPE…

八、宏、枚举值

宏、枚举值的命名 宏和枚举值全大写字母组成,单词通过下划线界定,如:ERROR_UNKNOWN,OP_STOP…

九、函数的名字修饰

函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串。用来指明函数的定义或原型。LINK程序或其它工具有时须要指定函数的名字修饰来定位函数的正确位置。

还有一种须要指定函数的 名字修饰的情况是在汇编程序中调用C或C++的函数。

十、C编译器的函数名修饰规则

对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其參数的字节数。比如 _functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀。比如_functionname。 __fastcall调用约定在输出函数名前加上一个“@”符号。后面也是一个“@”符号和其參数的字节数,比如 @functionname@numbe

十一、C++编译器的函数名修饰规则

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”标识结束。

注:

  • 1.__stdcall :以“?”标识函数名的開始。后跟函数名。 函数名后面以“@@YG”标识參数表的開始,后跟參数表。
  • 2 __cdecl调用约定: 规则同上面的 _stdcall 调用约定,仅仅是參数表的開始标识由上面的“@@YG”变为“@@YA”
  • 3 __fastcall调用约定: 规则同上面的_stdcall调用约定,仅仅是參数表的開始标识由上面的“@@YG”变为“@@YI”。
  • VC++对函数的省缺声明是"__cedcl",将仅仅能被C/C++调用。

十二、查看函数的名字修饰

有两种方式能够检查你的程序中的函数的名字修饰:使用编译输出列表或使用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



Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  Tags: C++  点击:(17)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  Tags: C++  点击:(19)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  Tags: C++  点击:(38)  评论:(0)  加入收藏
C++编程中,你是否有为 我到底该写个struct还是class 而苦恼过?如果你到现在还不知道该如何选择,那么请求继续阅读,下文或许能给你些建议。问题的产生C++语言继承了 C语言的 stru...【详细内容】
2021-10-18  Tags: C++  点击:(63)  评论:(0)  加入收藏
C++在C的面向过程概念的基础上提供了面向对象和模板(泛型编程)的语法功能。下面以一个简单实例(动态数组的简单封装,包括下标的值可以是任意正数值,并提供边界检查)来说明C++是如...【详细内容】
2021-10-18  Tags: C++  点击:(50)  评论:(0)  加入收藏
0 前言Hello,大家好,欢迎来到『自由技艺』的 C++ 系列专题。代码重用,尽可能避免冗余代码是程序员的一项必备技能,今天就来给大家介绍其中一种:函数装饰器。在设计模式中,与它对应...【详细内容】
2021-09-28  Tags: C++  点击:(75)  评论:(0)  加入收藏
今天我们就来聊一聊 C++ 中的异常机制吧。在学校期间,我们很少会用得上异常机制。然而,工作之后,很多时候却不得不引入异常机制。因为一般情况下,使用函数的返回值来确定函数的...【详细内容】
2021-09-26  Tags: C++  点击:(182)  评论:(0)  加入收藏
一、内存泄漏(memory leak)内存泄漏(memory leak)是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存...【详细内容】
2021-09-03  Tags: C++  点击:(105)  评论:(0)  加入收藏
stack容器#include <iostream>using namespace std;#include <stack>//容器头文件void test(){stack<int>p;p.push(100);p.push(1000);p.push(100);while(!p.empty()){cout<...【详细内容】
2021-08-17  Tags: C++  点击:(81)  评论:(0)  加入收藏
stl 常用遍历算法(for_each transform)示例代码(结论在结尾!!!!)#include<iostream>using namespace std;#include"vector"#include"map"#include"string"#include"list"#in...【详细内容】
2021-08-13  Tags: C++  点击:(89)  评论:(0)  加入收藏
▌简易百科推荐
一、简介很多时候我们都需要用到一些验证的方法,有时候需要用正则表达式校验数据时,往往需要到网上找很久,结果找到的还不是很符合自己想要的。所以我把自己整理的校验帮助类分...【详细内容】
2021-12-27  中年农码工    Tags:C#   点击:(2)  评论:(0)  加入收藏
引言在学习C语言或者其他编程语言的时候,我们编写的一个程序代码,基本都是在屏幕上打印出 hello world ,开始步入编程世(深)界(坑)的。C 语言版本的 hello world 代码:#include <std...【详细内容】
2021-12-21  一起学嵌入式    Tags:C 语言   点击:(11)  评论:(0)  加入收藏
读取SQLite数据库,就是读取一个路径\\192.168.100.**\position\db.sqlite下的文件<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/...【详细内容】
2021-12-16  今朝我的奋斗    Tags:c#   点击:(21)  评论:(0)  加入收藏
什么是shellshell是c语言编写的程序,它在用户和操作系统之间架起了一座桥梁,用户可以通过这个桥梁访问操作系统内核服务。 它既是一种命令语言,同时也是一种程序设计语言,你可以...【详细内容】
2021-12-16  梦回故里归来    Tags:shell脚本   点击:(18)  评论:(0)  加入收藏
一、编程语言1.根据熟悉的语言,谈谈两种语言的区别?主要浅谈下C/C++和PHP语言的区别:1)PHP弱类型语言,一种脚本语言,对数据的类型不要求过多,较多的应用于Web应用开发,现在好多互...【详细内容】
2021-12-15  linux上的码农    Tags:c/c++   点击:(17)  评论:(0)  加入收藏
1.字符串数组+初始化char s1[]="array"; //字符数组char s2[6]="array"; //数组长度=字符串长度+1,因为字符串末尾会自动添&lsquo;\0&lsquo;printf("%s,%c\n",s1,s2[2]);...【详细内容】
2021-12-08  灯-灯灯    Tags:C语言   点击:(47)  评论:(0)  加入收藏
函数调用约定(Calling Convention),是一个重要的基础概念,用来规定调用者和被调用者是如何传递参数的,既调用者如何将参数按照什么样的规范传递给被调用者。在参数传递中,有两个很...【详细内容】
2021-11-30  小智雅汇    Tags:函数   点击:(19)  评论:(0)  加入收藏
一、问题提出问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?注:5,1,1和1 5 1属同一种方法m,n均小于10二、算法分析设f(m,n) 为m个苹果,n个盘子的放法数目,则先对...【详细内容】
2021-11-17  C语言编程    Tags:C语言   点击:(49)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  深度Linux    Tags:C++   点击:(38)  评论:(0)  加入收藏
OpenCV(Open Source Computer Vision Library)是一个(开源免费)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android、ios等操作系统上,它轻量级而且高效---由一系列...【详细内容】
2021-11-11  zls315    Tags:C#   点击:(50)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条