当前位置:首页 > 程序员所要知道的编程规范、编码规范
编程规范(C/C++)
〖建议6-3〗如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
说明:下面两个示例中,反例比正例多执行了NUM -1 次逻辑判断。并且由于前者总要进行逻辑判断,使得编译器不能对循环进行优化处理,降低了效率。如果NUM 非常大,最好采用正例的写法,可以提高效率。
const int NUM = 100000; 正例:
if (bCondition) {
for (i = 0; i < NUM; i++) {
DoSomething(); } } else {
for (i = 0; i < NUM; i++) {
DoOtherthing(); } }
反例:
for (i = 0; i < NUM; i++) {
if (bCondition) {
DoSomething(); } else {
DoOtherthing(); } }
37
编程规范(C/C++)
〖建议6-4〗在进行“==”比较时,将常量或常数放在“==”号的左边。
说明:可以采用这种方式,让编译器去发现错误。 正例:
if (NULL == pTail) if (0 == iSum)
示例中有意把p和NULL颠倒。编译器认为 if (pTail = NULL) 是合法的,但是会指出 if (NULL = pTail)是错误的,因为NULL 不能被赋值。
6.7 函数与过程
函数是C/C++程序的基本功能单元。如何编写出正确、高效、易维护的函数是软件编码质量控制的关键。一个函数包括函数头,函数名,函数体,参数,返回值。其中函数头的编写参见注释章节,函数名参见命名规则章节,本章着重描述作为接口要素的参数和返回值,函数体的实现以及函数相互之间的调用关系。
6.7.1 参数
【规则7-1-1】除构造和析构函数外,如果函数没有参数,则用void 填充。
说明:函数在说明的时候,可以省略参数名。但是为了提高代码的可读性,要求不能省略。
正例:
void SetValue(int iWidth, int iHeight); float GetValue(void);
反例:
void SetValue(int, int); float GetValue();
【规则7-1-2】如果参数是指针,且仅作输入用,则应在类型前加const。
说明:防止该指针在函数体内被意外修改。 正例:
int GetStrLen(const char *pcString);
38
编程规范(C/C++)
【规则7-1-3】当结构变量作为参数时,应传送结构的指针而不传送整个结构体,并且不得修改结构中的元素,用作输出时除外。
说明:一个函数被调用的时候,形参会被一个个压入被调函数的堆栈中,在函数调用结束以后再弹出。一个结构所包含的变量往往比较多,直接以一个结构为参数,压栈出栈的内容就会太多,不但占用堆栈空间,而且影响代码执行效率,如果使用不当还可能导致堆栈的溢出。如果使用结构的指针作为参数,因为指针的长度是固定不变的,结构的大小就不会影响代码执行的效率,也不会过多地占用堆栈空间。
〖建议7-1-1〗避免函数有太多的参数,参数个数尽量控制在5 个以内。
说明:如果参数太多,在使用时容易将参数类型或顺序搞错,而且调用的时候也不方便。如果参数的确比较多,而且输入的参数相互之间的关系比较紧密,不妨把这些参数定义成一个结构,然后把结构的指针当成参数输入。
〖建议7-1-2〗参数的顺序要合理。
说明:参数的顺序要遵循程序员的习惯。如输入参数放在前面,输出参数放在后面等。
正例:
int RelRadioChan(const T_RelRadioChanReq *ptReq,
T_RelRadioChanAck *ptAck);
6.7.2 返回值
【规则7-2-1】除构造和析构函数外,不要省略返回值的类型,如果函数没有返回值,那么应声明为void 类型。
【规则7-2-2】对于有返回值的函数,每一个分支都必须有返回值。
说明:为了保证对被调用函数返回值的判断,有返回值的函数中的每一个退出点都需要有返回值。
〖建议7-2-1〗如果返回值表示函数运行是否正常,规定0 为正常退出,不同非0 值标识不同异常退出。避免使用TRUE 或FALSE 作为返回值。
正例:
int SubFunction(void);
39
编程规范(C/C++)
反例:
BOOLEAN SubFunction(void);
6.7.3 内部实现
函数体的实现中,不但要仔细检查入口参数的有效性和精心设计返回值,还要保证函数的功能单一,具有很高的功能内聚性,尽量减少函数之间的耦合,方便调试和维护。
【规则7-3-1】对输入参数的正确性和有效性进行检查。
说明:很多程序错误是由非法参数引起的,我们应该充分理解并正确处理来防止此类错误。
【规则7-3-2】防止将函数的参数作为工作变量。
说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。
正例:
void SumData(int iNum, int *piData, int *piSum ) {
int iCount ;
int iSumTmp; // 存储“和”的临时变量 iSumTmp = 0;
for (iCount = 0; iCount < iNum; iCount++) {
iSumTmp += piData[iCount]; }
*piSum = iSumTmp; }
反例:
void SumData(int iNum, int *piData, int *piSum ) {
int iCount; *piSum = 0;
40
共分享92篇相关文档