C代码规范及建议

  • 格式:doc
  • 大小:92.50 KB
  • 文档页数:15

目 录

一、 文件结构

1.1 版权和版本的声明

1.2 头文件的结构

1.3 定义文件的结构

二、文件的版式

2.1 空行的用法

2.2 代码行

2.3 代码行内的空格

2.4 对齐

2.5 长行拆分

2.6 修饰符的位置

2.7 注释

三、命名规则

3.1 命名基本规则

四、表达式和基本语句

4.1 运算符的优先级

4.2 复合表达式

4.3 if 语句

4.4 循环语句的效率

五、函数设计

5.1 参数的规则

5.2 返回值的规则

5.3 函数内部实现的规则

5.4 其它建议

六、其它经验和建议

6.1 提高程序的效率

一、文件结构

每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。

C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀

1.1 版权和版本的声明

版权和版本的声明位于头文件和定义文件的开头,主要内容有:

(1)版权信息。

(2)文件名称,文件内容摘要。

(3)当前版本号,最后修改日期。

格式如下:

示例如下:

示例1-1 版权和版本的声明 /*--------------------------------------------------------------------------

Siss8118.h

Header file for Siss5118

Version 1.0

Last Modify: 2005.12.30

Copyright (c) 2006 Shenzhen International Solution Software Co., Ltd.

All rights reserved.

--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------

文件名称

空行

文件摘要

Version版本号

Last Modify: 最后更改日期

Copyright (c) 2006 Shenzhen International Solution Software Co., Ltd.

All rights reserved.

--------------------------------------------------------------------------*/ 1.2 头文件的结构

头文件由三部分内容组成:

(1)头文件开头处的版权和版本声明

(2)预处理块

(3)函数和结构体声明等

假设头文件名称为 Syscfg.h,头文件的结构参见示例

1.2.1 为了防止头文件被重复引用,应当用#ifndef/#define/#endif 结构产生预处理块

1.2.2 用#include 格式来引用标准库的头文件(编译器将从库目录开始搜索)

1.2.3 用#include “filename.h” 格式来引用非标准库的头文件(编译器将从工作目录开始搜索)

1.2.4 头文件中只存放函数和变量的“声明”而不存放函数和变量的“定义”

1.2.5 结构体定义应使用typedef定义结构体别名,避免直接使用struct直接定义结构体。

1.2.6 尽量避免使用全局变量,确实需要使用全局变量供其它模块引用时,必须在头文件中

使用类似extern int value声明。

1.2.7 头文件中存放需要引用的特殊宏(使用#define定义的宏替换)

1.2.8 在函数声明前存放函数需要引用的常量宏(使用#define定义的常量)

示例如下:

示例1-2 头文件的结构 // 版权和版本声明见示例1-1,此处省略。

#ifndef _SYSCFG_H // 防止syscfg.h 被重复引用

#define _SYSCFG_H

#include // 头文件中需要引用标准库的头文件

#include “main.h” // 头文件中需要引用非标准库的头文件

#define MEM_TYPE code // 特殊宏定义

typedef struct //结构体定义

{

}tSysCfg;

extern int iSysStatus; //全局变量声明

#define SYS_RUNNING_STATUS 1 // 全局函数引用宏定义

#define SYS_CONFIG_STATUS 2

void Function1(…); // 全局函数声明

#endif // _SYSCFG_H

1.3 定义文件的结构

定义文件有三部分内容:

(1) 定义文件开头处的版权和版本声明(参见示例1-1)

(2) 对一些头文件的引用

(3) 程序的全局变量,模块静态变量定义

(4) 程序的模块静态函数声明

(5) 程序的实现体(包括数据和代码)

假设定义文件的名称为 Syscfg.c,定义文件的结构参见示例1-3。

示例1-3 C文件的结构

// 版权和版本声明见示例1-1,此处省略。

#include // 模块中需要引用标准库的头文件

#include “main.h” // 模块中需要引用非标准库的头文件

#include “Syscfg.h” // 引用本模块头文件

#define SYS_STATUS_MAX 1 //模块常量宏定义

#define ZeroMemory(Destination,Length) memset((Destination),0,(Length)) //模块特殊宏定义

int iSysStatus; //全局变量定义

static int iSys; //模块静态变量定义

static void ReadCfg(…); // 模块静态函数声明

void Function1(…) // 全局函数实现

{

}

static void ReadCfg(…) // 模块静态函数实现

{

} 二、文件的版式

2.1 空行的用法

空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,所以不要舍不得用空行。

2.1.1 在每个类声明之后、每个函数定义结束之后都要加空行。

2.1.2 在一个函数体内,函数变量定义后面应加空行分隔。

2.1.3 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

示例如下:

示例2-1空行的用法

2.2 代码行

2.1.1 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

2.1.2 if、for、while、do 等语句自占一行,执行语句不得紧跟其后。

示例2-2代码行的风格:左边的为良好的风格,右边为不良的风格

// 空行

void Function1(…)

{

int i,j;

unsigned char cBuff[10];

// 空行

}

// 空行

void Function2(…)

{

}

// 空行

void Function3(…)

{

}

// 空行

while (condition)

{

statement1;

// 空行

if (condition)

{

statement2;

}

else

{

statement3;

}

// 空行

statement4;

}

x = a + b;

y = c + d;

z = e + f;

if (width < height)

{

dosomething();

}

for (initialization; condition; update)

{

dosomething();

}

// 空行

other(); x = a + b; y = c + d; z = e + f;

if (width < height) dosomething();

for (initialization; condition; update) dosomething();

other();