华为C语言软件编程规范和范例 下载本文

应分别改为如下:

*stat_poi += 1;

stat_poi++; // 此二语句功能相当于“ * stat_poi ++ += 1; ”

++ stat_poi;

*stat_poi += 1; // 此二语句功能相当于“ * ++ stat_poi += 1; ”

〔五〕 =====[ 变量、结构 ]=====

15-1 :去掉没必要的公共变量

说明:公共变量是增大模块间耦合的原因之一,故应减少没必要的公共变量以降低模块间的耦合度。

15-2 :仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系 说明:在对变量声明的同时,应对其含义、作用及取值范围进行注释说明,同时若有必要还应说明与其它变量的关系。

15-3 :明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等

说明:明确过程操作变量的关系后,将有利于程序的进一步优化、单元测试、系统联调以及代码维护等。这种关系的说明可在注释或文档中描述。 示例:在源文件中,可按如下注释形式说明。

RELATION System_Init Input_Rec Print_Rec Stat_Score Student Create Modify Access Access

Score Create Modify Access Access, Modify

注:RELATION为操作关系;System_Init、Input_Rec、Print_Rec、Stat_Score为四个不同的函数;Student、Score为两个全局变量;Create表示创建,Modify表示修改,Access表示访问。

其中,函数Input_Rec、Stat_Score都可修改变量Score,故此变量将引起函数间较大的耦合,并可能增加代码测试、维护的难度。

15-4 :当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生

说明:对公共变量赋值时,若有必要应进行合法性检查,以提高代码的可靠性、稳定性。

15-5 :防止局部变量与公共变量同名

说明:若使用了较好的命名规则,那么此问题可自动消除。

15-6 :严禁使用未经初始化的变量作为右值

说明:特别是在C/C++中引用未经赋值的指针,经常会引起系统崩溃。

?5-1 :构造仅有一个模块或函数可以修改、创建,而其余有关模块或函数只访问的公共变量,防止多个不同模块或函数都可以修改、创建同一公共变量的现象

说明:降低公共变量耦合度。

?5-2 :使用严格形式定义的、可移植的数据类型,尽量不要使用与具体硬件或软件环境关系密切的变量

说明:使用标准的数据类型,有利于程序的移植。

示例:如下例子(在DOS下BC3.1环境中),在移植时可能产生问题。

void main() {

register int index; // 寄存器变量

_AX = 0x4000; // _AX是BC3.1提供的寄存器“伪变量” ... // program code }

?5-3 :结构的功能要单一,是针对一种事务的抽象

说明:设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。 示例:如下结构不太清晰、合理。 typedef struct STUDENT_STRU {

unsigned char name[8]; /* student's name */ unsigned char age; /* student's age */

unsigned char sex; /* student's sex, as follows */ /* 0 - FEMALE; 1 - MALE */ unsigned char

teacher_name[8]; /* the student teacher's name */ unisgned char

teacher_sex; /* his teacher sex */ } STUDENT;

若改为如下,可能更合理些。 typedef struct TEACHER_STRU {

unsigned char name[8]; /* teacher name */

unisgned char sex; /* teacher sex, as follows */ /* 0 - FEMALE; 1 - MALE */ } TEACHER;

typedef struct STUDENT_STRU {

unsigned char name[8]; /* student's name */ unsigned char age; /* student's age */

unsigned char sex; /* student's sex, as follows */ /* 0 - FEMALE; 1 - MALE */ unsigned int teacher_ind; /* his teacher index */ } STUDENT;

?5-4 :不要设计面面俱到、非常灵活的数据结构

说明:面面俱到、灵活的数据结构反而容易引起误解和操作困难。

?5-5 :不同结构间的关系不要过于复杂

说明:若两个结构间关系较复杂、密切,那么应合为一个结构。 示例:如下两个结构的构造不合理。 typedef struct PERSON_ONE_STRU {

unsigned char name[8]; unsigned char addr[40]; unsigned char sex; unsigned char city[15]; } PERSON_ONE;

typedef struct PERSON_TWO_STRU {

unsigned char name[8]; unsigned char age; unsigned char tel; } PERSON_TWO;

由于两个结构都是描述同一事物的,那么不如合成一个结构。 typedef struct PERSON_STRU {

unsigned char name[8]; unsigned char age; unsigned char sex; unsigned char addr[40]; unsigned char city[15]; unsigned char tel; } PERSON;

?5-6 :结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数 说明:增加结构的可理解性、可操作性和可维护性。

示例:假如认为如上的_PERSON结构元素过多,那么可如下对之划分。 typedef struct PERSON_BASE_INFO_STRU {

unsigned char name[8]; unsigned char age; unsigned char sex; } PERSON_BASE_INFO;

typedef struct PERSON_ADDRESS_STRU {

unsigned char addr[40]; unsigned char city[15]; unsigned char tel; } PERSON_ADDRESS;

typedef struct PERSON_STRU