软件编程体会(为内存调试做准备)--命名规则

本文探讨了软件开发过程中数据结构及函数的命名规则,包括使用ANSI C标准数据类型、为类型添加前缀以及函数和头文件的命名方式,旨在提高代码可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:燕青 2007年4月23日
在软件开发中,数据结构和函数是整个软件必不可少的部分,对它的命名规则可能对整个项目的管理起着至关重要的作用。如果有一个良好的命名习惯,对于项目的开发和维护是相当有利的。这里我仅仅根据自己的体会,简单的阐述一下自己的心德,希望能够给读者一些有益的启迪,当然,也希望能够给我一些中肯的建议。
请喜欢标准ANSC C的数据类型
在很多项目中,有些设计者喜欢定义一些自己的数据类型,比如:
typedef signed char           int8;
typedef unsigned char         uint8;
typedef signed short          int16;
typedef unsigned short        uint16;
typedef signed int            int32;
typedef unsigned int          uint32
虽然说,这种定义能够使用户对于使用的类型及其大小有清晰的理解,但是我们势必将为在不同 CPU中定义许多宏,以确保定义的准确性。请看下表:
 
8bit CPU
32bit CPU
64bit CPU
Char
1 byte
1 byte
1 byte
short
2bytes
2bytes
2bytes
int
2bytes
4bytes
4bytes
Long
4bytes
4bytes
8bytes
void *
4bytes
4bytes
8bytes
从表中,我们不难看出,对于不同类型的 CPU,我们的必须一一却别,难道不累吗?我们现在的ANSC C已经帮助我们定义了一套整型变量,它们是
int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t等
它们已经被定义在 <stdint.h>标准头文件中,对于不同的硬件平台,它会帮助我们自动校正,我们何乐而不为呢 J?!
请为类型名添加合适的前缀字母
如果使用合适的前缀字母,能够帮助我们理解变量的类型。我一般喜欢这样命名这些类型。
类 (Class)
使用大写的 C开头,比如:CSocket, CTimer,等等
接口 (Interface)
使用大写的 I开头,比如:ISocket, ITimer,等等
结构 (Struct)
使用大写的 S开头,比如:SSocketAttr, STimerAttr,等等
联合 (Union)
使用大写的 U开头,比如:USocketParam, UTimerParam,等等
枚举 (Enum)
使用大写的 E开头,比如:EResult, ESocketMode,等等
函数指针
使用大写的 F开头,比如:typedef void (*FNotify)( void *arg );
接口函数命名规则
为函数命名是仁者见仁,智者见智,没有什么统一的规定。我这里仅仅是按照自己的喜好规定了一套命名的规则,请大家多提一些宝贵意见。请看下面的结构
[项目名 ]
模块名
[子模块名… ]
_
动宾结构
项目名是可选的,对于各个项目中的通用模块应该没有项目名。
模块名必须使用,若一个模块中有若干子模块,那么子模块名必须是命名的一部分,否则子模块名可以忽略。
动宾结构是动词 +名词的方式,主要是为了用户便以理解。
上面的讲述可能过于抽象,不妨举几个例子吧。
在项目中,一般都会有操作系统抽象层,这个层主要是为了便于在各种不同操作系统上程序有良好的移植性。
OsaMutex_Create(… ),Osa是Operation System Abstraction的缩写,它在多个项目中是一个公用部分,所以我们不该加上任何项目名。Mutex是Osa的互斥子模块,所以必须加入到命名中。‘_’是分隔字符,没有什么特别意思。因为对于互斥的创建没有需要的宾语,所以应该省去,仅仅保留一个动词。在有些情况下,宾语是必要的,比如:
OsaMutex_GetName()。此外,对于函数第一个字母,必须以大写开头。
再比如,我们在 WYQ项目中,有一个状态机模块,那么它的函数可以如此命名。
WyqStateMachine_Goto( … ).
内部函数命名规则
内部函数一般而言就是以 static修饰的函数,用于模块内部的具体实现。它的命名规则也很重要,为了便于与接口函数分开,我们采用如下的方法。
__
[项目名 ]
模块名
[子模块名… ]
_
动宾结构
与接口函数命名规则相似,唯一不同在于在函数名最前面以两个下划线开头。比如:
__OsaMutex_Create(… )就是OsaMutex_Create的内部实现,整个实现函数看上去如下格式:
EResult OsaMutex_Create( … )
{
    EResult rs;
if ( 参数无效 )
   return WYQ_EINV;
rs = __OsaMutex_Create( … );
if ( rs == WYQ_OK )
   增加 Mutex实例进入资源管理器
return rs;
}
外部接口函数头文件命名规则
它的命名规则有些类似于接口函数,不过它要比接口函数的命名规则更加的简单。
[项目名 ]
模块名
[子模块名… ]
.
h
我们还是以 Mutex为例,它的头文件的命名规则应该是OsaMutex.h。对于某些特有项目的接口函数头文件定义,也只要加入对应项目名就完事了,比如:WyqStateMachine.h。
内部接口函数头文件定义
它类似外部接口函数头文件的定义,紧紧在命名前面加入 __字符。
__
[项目名 ]
模块名
[子模块名… ]
.
h
比如 __OsaLinuxMutex.h, __WyqStateMachineCore.h。
 
小结
上面的几个小点仅仅说明了命名规则中的一个部分,应该还有其他很多很细的地方。不过从个人角度来看,我不喜欢被太多的游戏规则所限定,毕竟这样做的代价可能是埋没了很多软件人才的独特个性,难道不是吗
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值