




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、PAGE PAGE 41实验室内部(nib)C语言(yyn)编程规范(gufn)文件状态文件标识: 草稿文件当前版本:V1.0 正式文件作 者:徐平 更新文件完成日期:2009-11-17完成地点:杭州电子科技大学自动化学院版本(bnbn)历史版 本状 态作 者时 间备 注V0.8草稿文件徐平2009-11-52009-11-8徐平起草V0.9草稿文件徐平2009-11-92009-11-12朱滔修改,徐平补充V1.0正式文件徐平2009-11-122009-11-17朱滔增加typedef.h,徐平补充目 录文件(wnjin)结构3程序(chngx)排版(pi bn)6注释11命名规则13常
2、量、变量和结构15基本语句19函数22内存管理25附录26参考文献27第1章 文件结构每个C程序通常(tngchng)分为两个文件。一个文件用于保存程序的声明(declaration),称为(chn wi)头文件,另一个文件(wnjin)用于保存程序的实现(implementation),称为定义(definition)文件。C程序的头文件以“.h”为后缀,C 程序的定义文件以“.c”为后缀。1.1 版权和版本的声明 版权和版本的声明位于头文件和定义文件的开头(参见示例 1-1),主要内容有: (1)版权信息;(2)文件名称,作者,当前版本号,完成日期,文件功能描述;(3)版本历史信息。/*
3、Copyright (C), 2009-2010, College of Auto. Hangzhou Dianzi Univ. File name: filename.c Author: xupingVersion: 1.0Date: 2009-11-5 Description: / 用于详细说明此程序文件完成的主要功能,与其他模块 / 或函数的接口,输出值、取值范围、含义及参数间的控 / 制、顺序、独立或依赖等关系 Others: / 其它内容的说明 History: / 修改历史记录列表,每条修改记录应包括修改日期、修改 / 者及修改内容简述 1. Author: Date: Modif
4、ication: 2. Author: Date: Modification:*/示例1-1 版权和版本的声明1.2 头文件的结构(jigu)头文件由三部分内容(nirng)组成: 头文件开头处的版权(bnqun)和版本声明; 预处理块;函数和结构声明等。 假设头文件名称为 filename.h,头文件的结构参见示例 1-2。 / 版权和版本声明见示例 1-1,此处省略。#ifndef FILENAME_H / 防止filename.h 被重复引用 #define FILENAME_H #include / 引用标准库的头文件 #include “myheader.h” / 引用非标准库的头文
5、件 void function(); / 函数声明 struct BOX_STRU / 结构声明 BOX; #endif示例1-2 头文件的结构【规则 1-1】为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。【规则 1-2】用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。【规则 1-3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。【建议 1-1】头文件中只存放“声明”而不存放“定义”。【建议 1-2】不提倡使用全局变量,尽量不要在头文件中出现象 ext
6、ern int value 这类声明。1.3 定义文件的结构定义(dngy)文件有三部分内容: 1) 定义文件开头处的版权和版本(bnbn)声明(参见示例 1-1);2) 对一些(yxi)头文件的引用;3) 程序的实现体(包括数据和代码)。假设定义文件的名称为 filename.h,定义文件的结构参见示例1-3。/ 版权和版本声明见示例 1-1,此处省略。 #include “filename.h” / 引用头文件 / 函数的实现体 void function() 示例1-3 定义文件的结构1.4 头文件的作用 C 语言的初学者虽然会用使用头文件,但常常不明其理,这里对头文件的作用略作解释:
7、1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。 2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。1.5 目录结构 如果一个软件的头文件数目比较多(如超过十个),通常应将头文件和定义文件分别保存于不同的目录,以便于维护。 每一个工程都应尽可能将其用到的所有头文件及定义文件放到该工程目录下。头文件保存于工程目录下的includ
8、e目录,将定义文件保存于source目录(可以是多级目录)。 第2章 程序(chngx)排版 2.1 空行 【规则 2-1】在每个类声明(shngmng)之后、每个函数定义结束之后都要加空行。参见示例2.1(a)。【规则 2-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔(fng)。参见示例 2.1(b)。示例2-1(a) 函数之间的空行 示例2-1(b) 函数内部的空行/ 空行 void function1() / 空行 void function2() / 空行 void function3() / 空行while (condition) statement1;
9、 / 空行 if (condition) statement2; else statement3; / 空行 statement4; 代码行 【规则(guz) 2-3】一行代码只做一件事情,如只定义一个变量,或只写一条(y tio)语句。这样的代码容易阅读,并且方便于写注释。 【规则(guz) 2-4】if、for、while、do 等语句各占一行,执行语句不得紧跟其后。不论执行语句有多少都要加。这样可以防止书写失误。 示例 2-2 风格良好的代码行int width; / 宽度 int height; / 高度 int depth; / 深度 x = a + b; y = c + d; z
10、= e + f; if (width =”、“=”、“+”、“*”、“%”、“&”、“|”、“”这类操作符前后不加空格。 【建议 2-2】对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i10; i+)和 if (a=b) & (c= 2000) / 良好的风格 if(year=2000) / 不良的风格 if (a=b) & (c=b&c=d) / 不良的风格for (i=0; i10; i+) / 良好的风格 for(i=0;i10;i+) / 不良的风格 for (i = 0; I 10; i +) / 过多的空格x = a b
11、 ? a : b; / 良好的风格x=afunction(); / 不要写成 b - function();对齐(du q) 【规则(guz) 2-13】程序(chngx)的分界符“”和“”应独占一行并且(bngqi)位于同一列,同时与引用它们的语句左对齐。 【规则 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 / p
12、rogram code if (condition) / program code else / program code for (initialization; condition; update) / program code for (initialization; condition; update) / program code while (condition) / program code while (condition) / program code如果出现嵌套的,则使用缩进对齐,如: 长行拆分 【规则(guz) 2-14】代码(di m)行最大长度宜控制在70至80个字符
13、以内。代码行不要过长,否则眼睛看不过来,也不便于打印。 【规则(guz) 2-15】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例 2-6 长行的拆分if (very_longer_variable1 = very_longer_variable12) & (very_longer_variable3 = very_longer_variable14) & (very_longer_variable5 = b & c d & c + f =”或“=-EPSINON) & (x=EPSINON) 【规则6-
14、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 (p != 0) if (p) / 容易让人误解 p 是布尔变量 if (!p) 【规则6-7】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的
15、循环放在最外层,以减少 CPU 跨切循环层的次数。例如示例 6-10(b)的效率比示例6-10(a)的高。示例6-10(a) 低效率:长循环在最外层 示例6-10(b) 高效率:长循环在最内层for (row=0; row100; row+) for ( col=0; col5; col+ ) sum = sum + arowcol; for (col=0; col5; col+ ) for (row=0; row100; row+) sum = sum + arowcol; 【规则(guz)6-8】对于(duy)switch语句(yj),每个 case 语句的结尾不要忘了加 break,否则
16、将导致多个分支重叠(除非有意使多个分支重叠)。 【规则6-9】对于switch语句,不要忘记最后那个 default 分支。即使程序真的不需要 default 处理,也应该保留语句 default : break; 为了防止别人误以为你忘了default 处理。第7章 函数【规则 7-1】参数的书写要完整(wnzhng),不要贪图省事只写参数的类型而省略参数名字。如果函数没有参数,则用 void 填充。参见(cnjin)示例 7-1。示例(shl)7-1 函数参数的书写void set_value(int width, int height); / 良好的风格 void set_value(i
17、nt, int); / 不良的风格float get_value(void); / 良好的风格 float get_value(); / 不良的风格【规则 7-2】参数命名要恰当,顺序要合理。 示例7-2 函数参数的命名和顺序/ 编写字符串拷贝函数 StringCopy,它有两个参数分别取名为str1和str2,我们很难搞清楚/ 究竟是把 str1 拷贝到 str2 中,还是刚好倒过来。 void string_copy(char *str1, char *str2); / 不良的风格/ 参数的顺序要遵循程序员的习惯,应将目的参数放在前面,源参数放在后面。void string_copy(ch
18、ar *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_source);【建议 7-4】避免函数有太多的参数,参数个数尽量控制在 5 个以内。如果参数太多,在使用时容易将参数类型或
19、顺序搞错。 【建议 7-5】尽量不要使用类型和数目不确定的参数。 【规则 7-6】不要省略返回值的类型。 C 语言(yyn)中,凡不加类型说明的函数,一律自动按整型处理。这样做不会有什么好处,却容易被误解为 void 类型。如果函数没有返回值,那么应声明为 void 类型。【规则(guz) 7-7】函数名字与返回值类型(lixng)在语义上不可冲突。 示例7-4 函数名字与返回值类型语义冲突/ 违反这条规则的典型代表是C标准库函数getchar。 char c; c = getchar(); if (c = EOF) / 按照 getchar 名字的意思,将变量 c 声明为 char 类型是很
20、自然的事情。但不幸的是/ getchar的确不是 char 类型,而是 int 类型,其原型为:int getchar(void); / 由于c 是 char 类型,取值范围是-128,127,如果宏 EOF 的值在 char取值范围之外,/ 那么if 语句将总是失败,导致本例错误的责任并不在用户,是函数getchar误导了使用者。【规则 7-8】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用 return 语句返回。 【规则 7-9】函数的规模要小,功能要单一,不要设计多用途的函数。参见示例 7-5。示例7-5适当的函数定义/ 不良的函数定义int add_sub(
21、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);【规则(guz) 7-10】设计高扇入、合理(hl)扇出(小于7)的函数。说明:扇出是指一个函数直接(zhji)调用(控制)其它函数的数目,而扇入是指有多少上级函数调用它。【规则 7-11】减少函数本身或函
22、数间的递归调用。【规则 7-12】避免使用BOOL参数。说明:原因有二,其一是BOOL参数值无意义,TURE/FALSE的含义是非常模糊的,在调用时很难知道该参数到底传达的是什么意思;其二是BOOL参数值不利于扩充。还有NULL也是一个无意义的单词。【规则 7-13】用宏定义函数表达式时,要使用完备的括号。参见示例7-6。示例7-6 用宏定义表达式/ 以下为不良的表达式#define RECTANGLE_AREA(a, b) a * b #define RECTANGLE_AREA(a, b) (a * b) #define RECTANGLE_AREA(a, b) (a) * (b) / 以
23、下为良好的表达式#define RECTANGLE_AREA(a, b) (a) * (b) 第8章 内存管理内存(ni cn)分配方式有三种: 1) 从静态(jngti)存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 2) 在栈上创建。在执行函数时,函数内局部变量的存储单元(cn ch dn yun)都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc申请任意多少的内存,程序员自己负
24、责在何时用 free释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。【规则 8-1】用 malloc申请内存之后,应该立即检查指针值是否为 NULL。防止使用指针值为 NULL 的内存。【规则 8-2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 【规则 8-3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 【规则 8-4】动态内存的申请与释放必须配对,防止内存泄漏。 【规则 8-5】用 free释放了内存之后,立即将指针设置为 NULL,防止产生“野指针”。【规则 8-6】指针变量一定要初始化。任何指针变量刚被创建时不会自动成为
25、 NULL 指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。附录/* Copyright (C), 2009-2010, College of Auto. Hangzhou Dianzi Univ. File name: typedefs.h Author: zhutao Version: 1.0 Date: 2009-11-17 Description: 为统一实验室常用(chn yn)数据类型名称,定义了该头文件。以后如果 要用到该头文件的数据类型,包括(boku)该头文件即可。如果用到该 头文件没有(mi yu)定义的数据类型,可自行定义。 Others: 以后项目中都需要把该文件加入项目中! History: 1. Author: zhutao Date: 2009-11-12 Modification: 建立本文件 2. Author: xuping Date: 2009-11-17 Modification: 针对16/32位系统进行修改,默认系统为16位机*/#ifndef _TYPEDEFS_H#define _TYPEDEFS_Htypedef signed char INT8;typede
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中学教师资格证《教育知识与能力》能力提升试题B卷-附答案
- 药品管理制度相关试题(附答案)
- 中外建筑艺术漫谈知到智慧树答案
- 导尿相关知识考核试题及答案
- 新版《药品召回管理办法》培训试题及答案
- 中西医结合内科学知到智慧树答案
- 口腔护士四手操作流程试题(附答案)
- 2025年车辆挂名权抵押担保服务协议
- 2025年度汽车烤漆行业市场调研与咨询合同
- 2025年度城市污水处理设备采购安装及运营合同
- 中小学教师岗位安全工作指南培训
- DB14T 1596-2024玉米间作花生机械化栽培技术规程
- 2025-2030坚果炒货市场发展分析及行业投资战略研究报告
- 厨房安全知识培训
- 刑事撤案申请书
- 小学数学作业与核心素养的培养
- 2023年山东临沂中考英语试题及答案
- 2024年考研英语一阅读理解80篇试题及答案
- 金属非金属地下矿山紧急避险系统建设规范培训
- 企业环境与可持续发展制度
- 税务助理招聘笔试题与参考答案(某大型国企)2024年
评论
0/150
提交评论