原文地址:C语言初学者编程规范—命名规则

C是一门朴素的语言,你使用的命名也应该这样。与Modula-2和Pascal程序员不同,C程序员不使用诸如“ThisVariableIsATemporaryCounter”这样“聪明”的名字。C程序员应该叫它“tmp”,这写起来更简单,也不会更难懂。

然而,当面对复杂情况时就有些棘手,给全局变量取一个描述性的名字是必要的。把一个全局函数叫做“foo”是一种目光短浅的行为。全局函数也一样,如果你有一个统计当前用户个数的函数,应当把它命名为“count_active_user()”或者简单点些的类似名称,不应该命名为“cntusr()”。
1 三种流行的命名法则 目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。

(1)驼峰命令法。 正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:
printEmployeePaychecks();
print_employee_paychecks();

第一个函数名使用了驼峰命名法,函数名中的每一个逻辑断点都有一个大写字母来标记。第二个函数名使用了下划线法,函数名中的每一个逻辑断点都有一个下划线来标记。

驼峰命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多。另一方面,下划线法是C出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。

(2)匈牙利命名法。 广泛应用于象Microsoft Windows这样的环境中。Windows 编程中用到的变量(还包括宏)的命名规则为匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯-西蒙尼(Charles Simonyi) 提出的。

匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等。这些符号可以多个同时使用,顺序是先m_(成员变量)、再指针、再简单数据类型、再其它。这样做的好处在于能增加程序的可读性,便于对程序的理解和维护。

例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

(3)帕斯卡(pascal)命名法。 与驼峰命名法类似,二者的区别在于:驼峰命名法是首字母小写,而帕斯卡命名法是首字母大写,如:
DisplayInfo();
string UserName;
二者都是采用了帕斯卡命名法。

(4)三种命名规则的小结 :MyData就是一个帕斯卡命名的示例;myData是一个驼峰命名法,它第一个单词的第一个字母小写,后面的单词首字母大写,看起来像一个骆驼;iMyData是一个匈牙利命名法,它的小写的i说明了它的型态,后面的和帕斯卡命名相同,指示了该变量的用途。
2 命名的基本原则 (1)标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解 ——尽量采用采用英文单词或全部中文全拼表示,若出现英文单词和中文混合定义时,使用连字符“_”将英文与中文割开。较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。例如:temp->tmp、flag->标志寄存器、statistic->stat、increment->inc、message->msg等缩写能够被大家基本认可。

(2)命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。

(3)自己特有的命名风格,要自始至终保持一致,不可来回变化。 个人的命名风格,在符合所在项目组或产品组的命名规则的前提下,才可使用。(即命名规则中没有规定到的地方才可有个人命名风格)。

(4)对于变量命名,禁止取单个字符(如i 、j 、k... ),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i 、j 、k 作局部循环变量是允许的。 变量,尤其是局部变量,如果用单个字符表示,很容易敲错(如i写成j),而编译时又检查不出来,有可能为了这个小小的错误而花费大量的查错时间。

(5)除非必要,不要用数字或较奇怪的字符来定义标识符。

(6)命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。

(7)在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。对接口部分的标识符应该有更严格限制,防止冲突。 如可规定接口部分的变量与常量之前加上“模块”标识等。

(8)用正确的反义词组命名具有互斥意义的变量或相**作的函数等。
下面是一些在软件中常用的反义词组。
add / remove       begin / end        create / destroy
insert / delete       first / last         g et / release
increment / decrement                 put / get
add / delete         lock / unlock      open / close
min / max          old / new         start / stop
next / previous      source / target     show / hide
send / receive       source / destination
cut / paste          up / down

示例:
int  min_sum;
int  max_sum;
int  add_user( BYTE *user_name );
int  delete_user( BYTE *user_name );

(9)除了编译开关/ 头文件等特殊应用,应避免使用_EXAMPLE_TEST_ 之类以下划线开始和结尾的定义。
3 变量名的命名规则(1)变量的命名规则要求用“匈牙利法则”。
即开头字母用变量的类型,其余部分用变量的英文意思、英文的缩写、中文全拼或中文全拼的缩写,要求单词的第一个字母应大写。
即: 变量名=变量类型+变量的英文意思(或英文缩写、中文全拼、中文全拼缩写)
对非通用的变量,在定义时加入注释说明,变量定义尽量可能放在函数的开始处。
见下表:
bool 用b开头 b标志寄存器
int 用i开头 iCount
short int 用n开头 nStepCount
long int 用l开头 lSum
char  用c开头 cCount
unsigned char 用by开头
float 用f开头 fAvg
double 用d开头 dDeta
unsigned int(WORD) 用w开头 wCount
unsigned long int(DWORD) 用dw开头 dwBroad
字符串 用s开头 sFileName
用0结尾的字符串 用sz开头 szFileName

(2)指针变量命名的基本原则为:
对一重指针变量的基本原则为:“p”+变量类型前缀+命名,如一个float*型应该表示为pfStat。对二重指针变量的基本规则为:“pp”+变量类型前缀+命名。对三重指针变量的基本规则为:“ppp”+变量类型前缀+命名。

(3)全局变量用g_开头,如一个全局的长型变量定义为g_lFailCount。 即:变量名=g_+变量类型+变量的英文意思(或缩写)。此规则还可避免局部变量和全局变量同名而引起的问题。

(4)静态变量用s_开头,如一个静态的指针变量定义为s_plPerv_Inst。 即: 变量名=s_+变量类型+变量的英文意思(或缩写)

(5)对枚举类型(enum)中的变量,要求用枚举变量或其缩写做前缀。 并且要求用大写。如:
enum cmEMDAYS
{
EMDAYS_MONDAY;
EMDAYS_TUESDAY;
……
};

(6)对struct、union变量的命名要求定义的类型用大写。 并要加上前缀,其内部变量的命名规则与变量命名规则一致。

结构一般用S开头,如:
struct ScmNPoint
{
int nX;//点的X位置
int nY; //点的Y位置
};

联合体一般用U开头,如:
union UcmLPoint
{
LONG lX;
LONG lY;
}

(7)对常量(包括错误的编码)命名,要求常量名用大写,常量名用英文表达其意思。 当需要由多个单词表示时,单词与单词之间必须采用连字符“_”连接。
如:#define CM_FILE_NOT_FOUND CMMAKEHR(0X20B) 其中CM表示类别。

(8)对const 的变量要求在变量的命名规则前加入c_。 即:c_+变量命名规则;示例:const char* c_szFileName;
4 函数的命名规范 (1)函数的命名应该尽量用英文(或英文缩写、中文全拼、中文全拼缩写)表达出函数完成的功能——函数名应准确描述函数的功能。 遵循动宾结构的命名法则,函数名中动词在前,并在命名前加入函数的前缀,函数名的长度不得少于8个字母。函数名首字大写,若包含有两个单词的每个单词首字母大写。如果是OOP 方法,可以只有动词(名词是对象本身)。示例:
LONG GetDeviceCount(……);
void print_record( unsigned int rec_ind ) ;
int  input_record( void ) ;
unsigned char get_current_color( void ) ;

(2)避免使用无意义或含义不清的动词为函数命名。 如使用process、handle等为函数命名,因为这些动词并没有说明要具体做什么。

(3)必须使用函数原型声明。 函数原型声明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名;内部函数,只要注释其定义文件名——和调用者在同一文件中(简单程序)时不需要注释。
应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。
5 函数参数命名规范 (1)参数名称的命名参照变量命名规范。
(2)为了提高程序的运行效率,减少参数占用的堆栈,传递大结构的参数,一律采用指针或引用方式传递。
(3)为了便于其他程序员识别某个指针参数是入口参数还是出口参数,同时便于编译器检查错误,应该在入口参数前加入const标志。
如:……cmCopyString(const CHAR * c_szSource, CHAR * szDest)
6 文件名(包括动态库、组件、控件、工程文件等)的命名规范 文件名的命名要求表达出文件的内容,要求文件名的长度不得少于5个字母,严禁使用象file1,myfile之类的文件名。

C语言初学者编程规范—命名规则相关推荐

  1. 语言android编程规范,计算机语言编程规范-在路上.PDF

    计算机语言编程规范-在路上.PDF 计算机语言编程规范 版本:v0.8 Crifan Li 摘要 本文主要介绍了各种计算机语言编程规范的通用知识和某个特定语言的编程规范. 本文提供多种格式供: 在线阅 ...

  2. Android各国语言缩写以及各国语言Values文件夹命名规则

    Android各国语言缩写 en 英文  en_US 英文 (美国)  ar 阿拉伯文  ar_AE 阿拉伯文 (阿拉伯联合酋长国)  ar_BH 阿拉伯文 (巴林)  ar_DZ 阿拉伯文 (阿尔及 ...

  3. C语言基础-编程规范!代码不规范,自己两行泪!

    前言 一个好的程序编写规范是编写高质量程序的保证.清晰.规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试效率,从而最终保证软件的质量和可维护性. 说明 l 本文档主要适用于刚刚开始接 ...

  4. 华为python语言通用编程规范 模块导入顺序_Python编程规范

    1,Python编程规范 > 编码 所有的 Python 脚本文件都应在文件头标上 #-*- coding:utf-8 -*- 用于设置编辑器,默认保存为 utf-8 格式. > 注释 业 ...

  5. cadence SPB17.4 - 焊盘的规范命名规则

    前言 PCB Editor 17.4 导入其他EDA系统(e.g. AD)的pcb文件, 转换成自己的格式. 然后再将库导出到其他目录时,可以看到有单独的焊盘.pad文件. 很好奇这些焊盘文件的命名方 ...

  6. C语言用户自定义标识符的命名规则,c语言中用户标识符的命名规则介绍

    c语言中用户标识符的命名规则介绍 发布时间:2020-06-24 15:55:31 来源:亿速云 阅读:116 作者:元一 这期内容当中的小编将会给大家带来有关c语言中用户标识符的命名规则介绍,以专业 ...

  7. 测试类/测试包/演示类/演示包的命名规范/命名规则

    文章目录 1.测试类的命名规范 2.测试程序的包命名规范 3.测试方法命名规范 4.演示类/范例类的命名规范 1.测试类的命名规范 测试类命名规则:Test + 要测试的类名称 测试类命名规则:功能名 ...

  8. Android各国语言Values文件夹命名规则

    android多国语言文件夹文件汇总如下: 维吾尔文(中国):values-ug-rCN 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values ...

  9. 常用的命名规范/命名规则

    文章目录 骆驼式命名法(CamelCase) 帕斯卡命名法(PascalCase) 串式命名法(KebabCase) 下划线命名法(UnderScoreCase) 骆驼式命名法(CamelCase) ...

最新文章

  1. Python搭建Keras CNN模型破解网站验证码
  2. shell脚本编程之函数
  3. 报名 | 大数据打造智慧的政府门户讲座
  4. 如何成为一个合格的 Java程序员
  5. 来看看CDN网络安全防护的方案
  6. 优化案例(part7)--Latent Multi-view Subspace Clustering
  7. libaio.so.1 mysql_libaio.so.1()(64bit) is needed by MySQL-server
  8. LeetCode(集合)队列和栈的相互实现 golang
  9. Oracle 1204 RAC failover 测试 (二)
  10. 玩转 SpringBoot 2 快速整合 Servlet
  11. 李雅普诺夫和MIT两个MRAC案例的xcos模型
  12. 利用if...else if....else循环语句编程
  13. wps word与office word相比的优缺点
  14. 速读原著-TCP/IP(端口映射器)
  15. 如何在Excel选取想要的数据(特定行)
  16. 帝国cms 自动生成html,帝国cms实现用户访问页面自动生成html的方法
  17. 计算机应用物联网应用技术论文,计算机应用技术论文:物联网垃圾回收站设计与实现...
  18. 一文看尽 6篇 CVPR2021 2D 异常检测论文
  19. mac下面如何修改只读文件
  20. Fragment already added 错误

热门文章

  1. boss直聘简历-使用技术
  2. 聚类有效性检验(Hubert'Γ )
  3. 解决WIN10悄悄勾选代理
  4. uniapp去掉顶部导航栏后计算手机安全区距离,css背景模糊效果
  5. JS学习之BOM | client | scroll
  6. 机载雷达导论-学习笔记
  7. 关于Android切换系统字体大小和字体样式导致App崩溃或者界面错乱的问题
  8. itchat库实现简单的微信消息监听
  9. 音频领域中POP音相关问题
  10. day09-确认订单订单列表发布