实验室内部C语言编程规范V1.0._第1页
实验室内部C语言编程规范V1.0._第2页
实验室内部C语言编程规范V1.0._第3页
实验室内部C语言编程规范V1.0._第4页
实验室内部C语言编程规范V1.0._第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验室内部C语言编程规范文件状态文件标识: 草稿文件当前版本:V1.0 正式文件作 者:徐平 更新文件完成日期:2009-11-17完成地点:杭州电子科技大学自动化学院版本历史版 本状 态作 者时 间备 注V0.8草稿文件徐平2009-11-52009-11-8徐平起草V0.9草稿文件徐平2009-11-92009-11-12朱滔修改,徐平补充V1.0正式文件徐平2009-11-122009-11-17朱滔增加typedef.h,徐平补充目 录第1章 文件结构-3第2章 程序排版-6第3章 注释-11第4章 命名规则-13第5章 常量、变量和结构-15第6章 基本语句-19第7章 函数-22第

2、8章 内存管理-25附录-26参考文献-27第1章 文件结构每个C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件,另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀。1.1 版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头(参见示例 1-1),主要内容有: (1)版权信息;(2)文件名称,作者,当前版本号,完成日期,文件功能描述;(3)版本历史信息。/* Copyright (C), 2009-2010, College of

3、Auto. Hangzhou Dianzi Univ. File name: filename.c Author: xupingVersion: 1.0Date: 2009-11-5 Description: / 用于详细说明此程序文件完成的主要功能,与其他模块 / 或函数的接口,输出值、取值范围、含义及参数间的控 / 制、顺序、独立或依赖等关系 Others: / 其它内容的说明 History: / 修改历史记录列表,每条修改记录应包括修改日期、修改 / 者及修改内容简述 1. Author: Date: Modification: 2. Author: Date: Modificatio

4、n:*/示例1-1 版权和版本的声明1.2 头文件的结构头文件由三部分内容组成: 1) 头文件开头处的版权和版本声明; 2) 预处理块;3) 函数和结构声明等。 假设头文件名称为 filename.h,头文件的结构参见示例 1-2。 / 版权和版本声明见示例 1-1,此处省略。#ifndef FILENAME_H / 防止filename.h 被重复引用 #define FILENAME_H #include <math.h> / 引用标准库的头文件 #include “myheader.h” / 引用非标准库的头文件 void function(); / 函数声明 struct

5、BOX_STRU / 结构声明 BOX; #endif示例1-2 头文件的结构【规则 1-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。【规则 1-2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。【规则 1-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。【建议 1-1】头文件中只存放“声明”而不存放“定义”。【建议 1-2】不提倡使用全局变量,尽量不要在头文件中出现象 extern int value

6、这类声明。1.3 定义文件的结构定义文件有三部分内容: 1) 定义文件开头处的版权和版本声明(参见示例 1-1);2) 对一些头文件的引用;3) 程序的实现体(包括数据和代码)。假设定义文件的名称为 filename.h,定义文件的结构参见示例1-3。/ 版权和版本声明见示例 1-1,此处省略。 #include “filename.h” / 引用头文件 / 函数的实现体 void function() 示例1-3 定义文件的结构1.4 头文件的作用 C 语言的初学者虽然会用使用头文件,但常常不明其理,这里对头文件的作用略作解释: 1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向

7、用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。 2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。1.5 目录结构 如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。 每一个工程都应尽可能将其用到的所有头文件及定义文件放到该工程目录下。头文件保存于工程目录下的include目录,将定义文件保存于source目录(可以是多级目录)。

8、第2章 程序排版 2.1 空行 【规则 2-1】在每个类声明之后、每个函数定义结束之后都要加空行。参见示例2.1(a)。【规则 2-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。参见示例 2.1(b)。示例2-1(a) 函数之间的空行 示例2-1(b) 函数内部的空行/ 空行 void function1() / 空行 void function2() / 空行 void function3() / 空行while (condition) statement1; / 空行 if (condition) statement2; else statement3; /

9、空行 statement4; 2.2 代码行 【规则 2-3】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。 【规则 2-4】if、for、while、do 等语句各占一行,执行语句不得紧跟其后。不论执行语句有多少都要加。这样可以防止书写失误。 示例 2-2 风格良好的代码行int width; / 宽度 int height; / 高度 int depth; / 深度 x = a + b; y = c + d; z = e + f; if (width < height) dosomething(); for (initializatio

10、n; condition; update) dosomething(); / 空行 other(); 【建议 2-1】尽可能在定义变量的同时初始化该变量(就近原则)。 如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。示例 2-3 风格良好的变量初始化int width = 10; / 定义并初绐化 width int height = 10; / 定义并初绐化 height int depth = 10; / 定义并初绐化 depth 2.3 空格 【规则 2-5】程序块要采用缩进风格编写,只使用空格键,且缩进

11、的空格数为4个,不使用TAB键。【规则 2-6】关键字之后要留空格。像 const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。像if、for、while 等关键字之后应留一个空格再跟左括号“(”,以突出关键字。 【规则 2-7】函数名之后不要留空格,紧跟左括号“(”,以与关键字区别。 【规则 2-8】“(”向后紧跟,“)”、“,”、“;”向前紧跟,紧跟处不留空格。 【规则 2-9】“,”之后要留空格,如 function(x, y, z)。如果;不是一行的结束符号,其后要留空格,如 for (initialization; condition;

12、update)。 【规则 2-10】赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“|”、“<<”,“”等二元操作符的前后应当加空格。 【规则 2-11】一元操作符如“!”、“”、“+”、“-”、“&”(地址运算符)等前后不加空格。 【规则 2-12】像“”、“.”、“->”这类操作符前后不加空格。 【建议 2-2】对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i<10; i+)和 if

13、 (a<=b) && (c<=d)。示例 2-4 代码行内的空格void func1(int x, int y, int z); / 良好的风格 void func1 (int x,int y,int z); / 不良的风格if (year >= 2000) / 良好的风格 if(year>=2000) / 不良的风格 if (a>=b) && (c<=d) / 良好的风格 if(a>=b&&c<=d) / 不良的风格for (i=0; i<10; i+) / 良好的风格 for(i=0;i&

14、lt;10;i+) / 不良的风格 for (i = 0; I < 10; i +) / 过多的空格x = a < b ? a : b; / 良好的风格x=a<b?a:b; / 不好的风格int *x = &y; / 良好的风格 int * x = & y; / 不良的风格 array5 = 0; / 不要写成 array 5 = 0; a.function(); / 不要写成 a . function(); b->function(); / 不要写成 b -> function();2.4 对齐 【规则 2-13】程序的分界符“”和“”应独占一行

15、并且位于同一列,同时与引用它们的语句左对齐。 【规则 2-14】 之内的代码块在“”右边数格处左对齐。 示例2-5(a)风格良好的对齐 示例2-5(b)风格不良的对齐void function(int x) / program code void function(int x) / program code if (condition) / program code else / program code if (condition) / program code else / program code for (initialization; condition; update) / pro

16、gram code for (initialization; condition; update) / program code while (condition) / program code while (condition) / program code如果出现嵌套的,则使用缩进对齐,如: 2.5 长行拆分 【规则 2-14】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 【规则 2-15】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例 2-6 长行的拆

17、分if (very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <= very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16) do_something(); int copy_person_address (PERSON_BASE_INFO_STRU PERSON_A, PERSON_BASE_INFO_STRU PERSON_B); for (very

18、_longer_initialization; very_longer_condition; very_longer_update) do_something(); 2.6 修饰符的位置【规则 2-16】应当将修饰符 * 和 & 紧靠变量名。 char *name; int *x, y; / 此处 y 不会被误解为指针 示例 2-7 修饰符的位置第3章 注释C 语言的块注释符为“/*/”,行注释一般采用“/”。注释通常用于: 1)版本、版权声明; 2)函数接口说明; 3)重要的代码行或段落提示。 虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例 3-1。 【规则 31】程序中

19、的注释不可喧宾夺主,应简洁明了。 【规则 32】如果代码本来就是清楚的,则不必加注释。【规则 33】边写代码边注释,修改代码的同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。 【规则 34】注释应当准确、易懂,防止注释有二义性。【规则 35】尽量避免在注释中使用缩写,特别是不常用缩写。 【规则 36】注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。 【规则 37】当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。 【规则 38】注释与所描述内容进行同样的缩排。【规则 39】每个函数定义前都要求有函数功能、输入、输出等参数的说明

20、。格式见示例3-1。示例3-1 程序的注释/* * 函数介绍: * 输入参数: * 输出参数: * 返回值: */ void function(float x, float y, float z) if () while () / end of while / end of if 【规则 3-10】对于所有的变量、常量,如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。对分支语句(条件分支、循环语句等)必须编写注释。【规则 3-11】全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。参见示例3-2。/* The ErrorCode

21、when SCCP translate */* Global Title failure, as follows */ / 变量作用、含义/* 0 SUCCESS 1 GT Table error */* 2 GT error Others no use */ / 变量取值范围/* only function SCCP_translate() in this modual can modify it, */* and other module can visit it through call */* the function get_trans_error_code() */ / 使用方法c

22、har g_trans_error_code; 示例3-2 全局变量的注释 第4章 命名规则【规则 4-1】标识符应当直观且可以拼读,可望文知意,可标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。【规则 4-2】标识符的长度应当符合“min-length && max-information”原则,即采用能代表变量或函数信息的最短长度字符即可。【规则 4-3】命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。【规则 4-4】程序中不要出现仅靠大小写区分的相似的标识符。 【

23、规则 4-5】程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。 【规则 4-6】变量和函数的名字中,除了专有名词(如硬件设备,寄存器,标准和协议等等)部分以外采用大写,其余均采用小写与下划线混排的格式。参见示例4-1和示例4-2。【规则 4-7】全局变量以g_开头,后面紧接变量名,这样便于与局部变量区分。float old_value; int set_value(.);示例4-1 基本的变量和函数命名规则int TCP_rev_buff1024; int USART_transmit_data(.);示例4-2 含有专有名词的变量和函数

24、命名规则【规则 4-8】常量、宏定义、自定义结构体的名字均采用大写与下划线混排的格式。参见示例4-3。示例4-3常量和结构的命名#define RADIUS 100;const unsigned char RADIUS = 100;typedef struct PERSON_BASE_INFO_STRU unsigned char name8; unsigned char age; unsigned char sex; PERSON_BASE_INFO;【规则 4-9】变量的名字应当使用“名词”或者“形容词名词”。参见示例4-4。示例4-4 变量的命名float value; float ol

25、d_value; float new_value; 【规则 4-10】函数的名字应当使用“动词”、“动词名词”(动宾词组)。参见示例4-5。 示例4-5 函数的命名draw_box(); get_value();【规则 4-11】用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。参见示例4-6。 示例4-6 互斥意义的变量和函数的命名int min_value; int max_value; int set_value(); int get_value(); 【建议 4-1】尽量避免名字中出现数字编号,如 value1,value2 等,除非逻辑上的确需要编号。【建议 4-2】对于变量

26、命名,禁止取单个字符(如i、j、k.),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。第5章 常量、变量和结构5.1 常量 常量是一种标识符,它的值在运行期间恒定不变。C 语言用 #define来定义常量(称为宏常量)。如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦? (1) 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。 (2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。 (3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。【规则

27、5-1】尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。【规则 5-2】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。【规则 5-3】能用常量尽量使用常量,减少使用宏定义。【规则 5-4】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。参见示例5-1。示例5-1 用宏定义具有关联关系的常量#define RADIUS 100;#define DIAMETER RADIUS * 2;【规则 5-5】常用的数据类型定义使用附录(typedefs.h文件)中的简写

28、形式。参见附录A。【建议 5-1】尽量以const替换#define。参见示例5-2。示例5-2 采用const定义具有关联关系的常量const float RADIUS = 100; const float DIAMETER = RADIUS * 2;5.2 变量【规则 5-6】去掉没必要的公共变量,降低模块间的耦合度。【规则 5-7】当向公共变量传递数据时,要十分小心,防止赋予不合理的值或越界等现象发生。【规则 5-8】严禁使用未经初始化的变量作为右值。说明:特别是在C中引用未经赋值的指针,经常会引起系统崩溃。【规则 5-9】使用标准的数据类型、可移植的数据类型,尽量不要使用与具体硬件或软

29、件环境关系密切的变量,有利于程序的移植。【规则 5-10】留心具体语言及编译器处理不同数据类型的原则及有关细节。说明:如在C语言中,static局部变量将在内存“数据区”中生成,而非static局部变量将在“堆栈”中生成。这些细节对程序质量的保证非常重要。5.3 结构【规则 5-11】结构的功能要单一,是针对一种现实事务的抽象。示例5-3 不合理的结构1typedef struct STUDENT_STRU unsigned char name8; /* student's name */ unsigned char age; /* student's age */ unsig

30、ned char sex; /* student's sex, as follows */ /* 0 - FEMALE; 1 - MALE */ unsigned char teacher_name8; /* the student teacher's name */ unisgned char teacher_sex; /* his teacher sex */ STUDENT;示例5-4 合理的结构1typedef struct TEACHER_STRUunsigned char name8; /* teacher name */ unisgned char sex; /*

31、 teacher sex, as follows */ /* 0 - FEMALE; 1 - MALE */ TEACHER;typedef struct STUDENT_STRU unsigned char name8; /* 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 teach

32、er index */ STUDENT; 【规则 5-12】不要设计面面俱到、非常灵活的数据结构。【规则 5-13】不同结构间的关系不要过于复杂,说明:若两个结构间关系较复杂、密切,那么应合为一个结构。示例5-5 不合理的结构2typedef struct PERSON_ONE_STRU unsigned char name8; unsigned char addr40; unsigned char sex; unsigned char city15; PERSON_ONE;typedef struct PERSON_TWO_STRU unsigned char name8; unsigned

33、 char age; unsigned char tel; PERSON_TWO; 示例5-6 合理的结构2typedef struct PERSON_STRU unsigned char name8; unsigned char age; unsigned char sex; unsigned char addr40; unsigned char city15; unsigned char tel; PERSON;【规则 5-14】结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数,增加结构的可理解性、可操作性和可维护性。参见示例5

34、-7。示例5-7 合理的结构3typedef struct PERSON_BASE_INFO_STRU unsigned char name8; unsigned char age; unsigned char sex; PERSON_BASE_INFO;typedef struct PERSON_ADDRESS_STRU unsigned char addr40; unsigned char city15; unsigned char tel; PERSON_ADDRESS;typedef struct PERSON_STRU PERSON_BASE_INFO person_base; PE

35、RSON_ADDRESS person_addr; PERSON; 【规则 5-15】设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减少引起误用现象。参见示例5-8。示例5-8 结构的调整/ 如下结构中的位域排列,将占较大空间,可读性也稍差。typedef struct EXAMPLE_STRU unsigned int valid: 1; PERSON person; unsigned int set_flg: 1; EXAMPLE;/ 若改成如下形式,不仅可节省1字节空间,可读性也变好了。typedef struct EXAMPLE_STRU unsigned int v

36、alid: 1; unsigned int set_flg: 1; PERSON person ; EXAMPLE;【规则 5-16】当声明用于分布式环境或不同CPU间通信环境的数据结构时,必须考虑机器的字节顺序、使用的位域及字节对齐等问题 。第6章 基本语句【规则 6-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。【规则 6-2】不要编写太复杂的复合表达式。参见示例6-1。 示例6-1 过于复杂的复合表达式i = a >= b && c < d && c + f <= g + h ; 【规则 6-3】不可将

37、布尔变量直接与 TRUE、FALSE 或者 1、0 进行比较。示例6-2 标准的布尔变量零值比较if语句/ 假设布尔变量名字为 flag,它与零值比较的标准 if 语句如下:if (flag) / 表示 flag 为真if (!flag) / 表示 flag 为假 示例6-3 不良的布尔变量零值比较if语句if (flag = TRUE) if (flag = 1 ) if (flag = FALSE) if (flag = 0) 【规则 6-4】应当将整型变量用“=”或“!=”直接与 0 比较。 示例6-4 标准的整型变量零值比较if语句/ 假设整型变量的名字为 value,它与零值比较的标

38、准 if 语句如下:if (value = 0) if (value != 0) 示例6-5 不良的整型变量零值比较if语句if (value) / 会让人误解 value 是布尔变量 if (!value) 【规则6-5】不可将浮点变量用“=”或“!=”与任何数字比较。 千万要留意,无论是 float 还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“=”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。 示例6-6 错误的浮点变量比较表达式/ 假设浮点变量的名字为 x if (x = 0.0) / 隐含错误的比较 示例6-7 正确的浮点变量比较

39、表达式/ EPSINON 是允许的误差(即精度)。if (x>=-EPSINON) && (x<=EPSINON) 【规则6-6】应当将指针变量用“=”或“!=”与 NULL 比较。 指针变量的零值是“空”(记为 NULL)。尽管 NULL 的值与 0 相同,但是两者意义不同。 示例6-8标准的指针变量零值比较if 语句/ 假设指针变量的名字为 p if (p = NULL) / p 与 NULL 显式比较,强调 p 是指针变量 if (p != NULL) 示例6-9 不良的指针变量零值比较if 语句if (p = 0) / 容易让人误解 p 是整型变量 if (

40、p != 0) if (p) / 容易让人误解 p 是布尔变量 if (!p) 【规则6-7】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。例如示例 6-10(b)的效率比示例6-10(a)的高。示例6-10(a) 低效率:长循环在最外层 示例6-10(b) 高效率:长循环在最内层for (row=0; row<100; row+) for ( col=0; col<5; col+ ) sum = sum + arowcol; for (col=0; col<5; col+ ) for (row=0; row&l

41、t;100; row+) sum = sum + arowcol; 【规则6-8】对于switch语句,每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分支重叠)。 【规则6-9】对于switch语句,不要忘记最后那个 default 分支。即使程序真的不需要 default 处理,也应该保留语句 default : break; 为了防止别人误以为你忘了default 处理。第7章 函数【规则 7-1】参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用 void 填充。参见示例 7-1。示例7-1 函数参数的书写void

42、 set_value(int width, int height); / 良好的风格 void set_value(int, int); / 不良的风格float get_value(void); / 良好的风格 float get_value(); / 不良的风格【规则 7-2】参数命名要恰当,顺序要合理。 示例7-2 函数参数的命名和顺序/ 编写字符串拷贝函数 StringCopy,它有两个参数分别取名为str1和str2,我们很难搞清楚/ 究竟是把 str1 拷贝到 str2 中,还是刚好倒过来。 void string_copy(char *str1, char *str2); / 不

43、良的风格/ 参数的顺序要遵循程序员的习惯,应将目的参数放在前面,源参数放在后面。void string_copy(char *str_source, char *str_destination); / 不良的顺序void string_copy(char *str_destination, char *str_source); / 良好的顺序【规则 7-3】如果参数是指针,且仅作输入用,则应在类型前加 const,以防止该指针在函数体内被意外修改。 示例7-3 函数参数的指针类型void string_copy(char *str_destination,const char *str_sou

44、rce);【建议 7-4】避免函数有太多的参数,参数个数尽量控制在 5 个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。 【建议 7-5】尽量不要使用类型和数目不确定的参数。 【规则 7-6】不要省略返回值的类型。 C 语言中,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处,却容易被误解为 void 类型。如果函数没有返回值,那么应声明为 void 类型。【规则 7-7】函数名字与返回值类型在语义上不可冲突。 示例7-4 函数名字与返回值类型语义冲突/ 违反这条规则的典型代表是C标准库函数getchar。 char c; c = getchar(); if (c = E

45、OF) / 按照 getchar 名字的意思,将变量 c 声明为 char 类型是很自然的事情。但不幸的是/ getchar的确不是 char 类型,而是 int 类型,其原型为:int getchar(void); / 由于c 是 char 类型,取值范围是-128,127,如果宏 EOF 的值在 char取值范围之外,/ 那么if 语句将总是失败,导致本例错误的责任并不在用户,是函数getchar误导了使用者。【规则 7-8】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用 return 语句返回。 【规则 7-9】函数的规模要小,功能要单一,不要设计多用途的函数。参

46、见示例 7-5。示例7-5适当的函数定义/ 不良的函数定义int add_sub( int a, int b, unsigned char add_sub_flg ) if (add_sub_flg = INTEGER_ADD) return (a + b); else return (a - b); / 良好的函数定义int add( int a, int b ) return (a + b);int sub( int a, int b ) return (a - b);【规则 7-10】设计高扇入、合理扇出(小于7)的函数。说明:扇出是指一个函数直接调用(控制)其它函数的数目,而扇入是指有多少上级函数调用它。【规则 7-11】减

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论