C语言编程规范_IBM
C语言代码规范
C语言代码规范C语言是一种广泛应用于编程领域的高级编程语言,具有跨平台、效率高、灵活性强等优点。
编写规范合乎标准的C语言代码有助于提高代码的可读性、可维护性和可移植性。
本文将介绍一些常用的C语言代码规范,以帮助开发者编写高质量的C语言程序。
一、代码格式1. 缩进:使用四个空格进行缩进,不要使用制表符。
这样可以保证在不同编辑器或显示器上显示的代码缩进一致。
2. 行长度限制:每行代码应尽量保持在80个字符以内,超过限制的代码可以进行适当换行。
换行时要注意保持代码的清晰可读性,一般可以采用缩进来表达代码的层次关系。
3. 大括号:大括号的位置应该和相关语句对齐,且起始的大括号应该放在语句所在行的末尾,而不是单独另起一行。
4. 空格和空行:在适当的情况下使用空格和空行可以提高代码的可读性。
例如,在运算符和操作数之间使用空格,不同的代码块之间使用空行进行分割等。
二、命名规范1. 变量名:使用有意义的变量名,尽量避免使用单个字符或简单的缩写表示变量。
变量名应该忠实地反映其所代表的含义。
2. 函数名:函数名应使用动词和名词的组合,具体描述函数的功能。
函数名应该清晰地表达其所完成的操作或所返回的结果。
3. 常量名:常量名使用全大写字母,并使用下划线进行分隔。
例如,MAX_LENGTH。
4. 类型名:类型名使用首字母大写的驼峰命名法,例如,StudentInfo。
5. 宏定义名:宏定义名使用全大写字母,并使用下划线进行分隔。
例如,PI。
三、注释规范1. 单行注释:使用"//"进行单行注释,注释符号后面应该留一个空格。
注释应该清晰明了,解释代码的用途或特殊处理等。
2. 多行注释:使用"/*"和"*/"进行多行注释。
多行注释通常用于解释一整块代码的功能或原理等。
3. 函数注释:在每个函数定义的上方加上函数注释,注释中应该包含函数的功能描述、输入参数的说明、返回值的含义以及可能抛出的异常等信息。
C语言代码规范(编程规范)
什么叫规范?在C语言中不遵守编译器的规定,编译器在编译时就会报错,这个规定叫作规则。
但是有一种规定,它是一种人为的、约定成俗的,即使不按照那种规定也不会出错,这种规定就叫作规范。
虽然我们不按照规范也不会出错,但是那样代码写得就会很乱。
大家刚开始学习C语言的时候,第一步不是说要把程序写正确,而是要写规范。
因为如果你养成一种非常不好的写代码的习惯,代码就会写得乱七八糟,等到将来工作面试的时候,这样的习惯可能会让你失去机会。
代码如何写才能规范那么代码如何写才能写得很规范呢?代码的规范化不是说看完本节内容后就能实现的。
它里面细节很多,而且需要不停地写代码练习,不停地领悟,慢慢地才能掌握的一种编程习惯。
所以大家不要想着一下子就能把代码规范化的所有知识全部掌握,也不要想着一下子就能把代码写规范,这是不太可能的。
有很多知识,比如为什么代码要这样写,为什么不能那样写,作为一个初学者你是很难弄明白的。
有很多规范是为了在程序代码量很大的时候,便于自己阅读,也便于别人阅读。
所以刚开始的时候有很多规范你不知道为什么要那样规定,你就单纯地模仿就行了。
等将来敲代码敲得时间长了,你就会感觉到那样写是很有好处的。
代码规范化的好处代码规范化的第一个好处就是看着很整齐、很舒服。
假如你现在用不规范的方式写了一万行代码,现在能看得懂,但等过了三个月你再回头看时就很吃力了,更不要说给别人看了。
所以代码要写规范,比如加注释就是代码规范化的一个思想。
在一般情况下,根据软件工程的思想,我们的注释要占整个文档的20%以上。
所以注释要写得很详细,而且格式要写得很规范。
第二个好处是,把代码写规范则程序不容易出错。
如果按照不规范的格式输入代码的话,很容易出错。
而代码写规范的话即使出错了查错也会很方便。
格式虽然不会影响程序的功能,但会影响可读性。
程序的格式追求清晰、美观,是程序风格的重要构成元素。
代码规范化的七大原则代码规范化基本上有七大原则,体现在空行、空格、成对书写、缩进、对齐、代码行、注释七方面的书写规范上。
c语言编程的书写规则
c语言编程的书写规则C语言编程的书写规则主要遵循以下规范:1. 缩进和空格:缩进和空格的使用可以使代码更易读。
通常,运算符两侧、逗号之后、控制语句(如if、for、while等)前后应添加空格。
在函数和括号的开头和结尾,通常应有空行。
2. 命名规则:变量和函数名应简洁且有意义。
通常,变量名和函数名以小写字母开头,后续单词的首字母大写,如 `myVariable`。
3. 注释:注释应简洁明了,解释代码的作用或目的,而不是解释代码是如何工作的。
注释应放在代码的上方或旁边,与代码保持一定距离。
4. 函数:函数应该尽可能短小,只做一件事情。
函数应具有描述性的名称,参数列表应清晰,并应包含返回类型。
5. 大括号:在C语言中,大括号 `{}` 用于定义代码块。
每一个独立的语句块都应该使用大括号。
6. 控制结构:控制结构(如if-else、for、while等)应该清晰明了,控制语句应只包含必要的逻辑。
7. 类型定义:类型定义应清晰明了,如果有必要,可以使用typedef来定义新的类型名称。
8. 预处理器指令:预处理器指令(如include、define等)应放在源文件的顶部。
9. 避免魔法数字和字符串:魔法数字和字符串(硬编码的值)会使代码难以理解和维护。
如果需要在代码中使用特定的值,应将其定义为常量或宏。
10. 避免全局变量:全局变量会使代码难以理解和维护,并可能导致意外的副作用。
尽可能使用局部变量。
11. 错误处理:在可能失败的操作后,应检查错误并相应地处理它们。
以上只是一些基本的C语言编程规则,实际编写代码时可能还需要考虑更多因素,如代码的可读性、可维护性、性能等。
C语言编程规范与风格
C语言编程规范与风格C语言是一种广泛使用的编程语言,它的编程规范与风格对于保证代码的可读性、可维护性和可扩展性至关重要。
本文将介绍一些关键的C语言编程规范与风格,并提供一些实践建议。
1. 代码缩进代码缩进是C语言中非常重要的一个方面,它可以使代码结构清晰,易于阅读。
推荐使用4个空格或者制表符来进行代码缩进。
2. 命名规范为了让代码更易读和理解,命名规范应具有一定的规则性和描述性。
变量、函数和常量的命名应具有一定的规范,比如使用驼峰命名法(camelCase)或者下划线法(underscore_case)。
3. 注释注释是代码中的重要组成部分,可以使代码更易读和理解。
应该在代码中适当地使用注释,解释代码的功能、用途和注意事项。
注释应该清晰、简洁且易于理解。
4. 函数设计函数是C语言中重要的组织单元,应该遵循一定的设计原则来编写函数。
函数应该具有良好的命名,功能单一且高内聚。
函数的参数应该明确且合理,避免过多的参数传递。
函数的返回值应该清晰地说明其含义。
5. 条件语句和循环语句条件语句和循环语句是C语言中常用的流程控制语句,应该遵循一定的格式和风格。
条件语句的括号应该与关键字紧挨着,条件表达式应该适当地加上括号,以增加代码的可读性。
循环语句的条件表达式应该明确且易于理解,循环体应该具有合适的缩进。
6. 数据类型和变量声明在C语言中,数据类型和变量声明是非常重要的。
应该根据需要选择合适的数据类型,尽量避免使用过长或过短的数据类型。
变量声明应该在函数开头或者合适的位置进行,尽量避免使用全局变量。
7. 引入头文件C语言中的头文件对代码的模块化和可维护性非常重要。
在代码中应该适当引入所需要的头文件,避免使用过多的全局引入。
头文件应该具有合适的宏定义和条件编译,以提高代码的可复用性。
8. 错误处理在编程过程中,错误处理是非常重要的一部分。
应该养成检查错误和处理错误的习惯,合理运用条件语句和错误码,以便更好地调试和修复代码。
c语言 编码规则
C语言编码规则
一、标识符命名规则
1. 标识符由字母、数字和下划线组成,第一个字符必须是字母或下划线。
2. 标识符不能是C语言的关键字。
3. 标识符应具有明确的意义,能够清晰地表达变量或函数的用途。
二、语法规则
1. C语言程序由一个或多个函数组成,主函数是程序的入口点。
2. 每个函数必须以函数声明开始,包括函数名、返回类型和参数列表。
3. 语句必须以分号结尾,表示语句的结束。
4. 注释以/* 开头,以*/ 结尾,用于解释代码的作用和功能。
三、数据类型规则
1. C语言支持基本数据类型,如整型、浮点型、字符型等。
2. C语言还支持结构体、数组、指针等复杂数据类型。
3. 每种数据类型都有其特定的取值范围和存储大小。
四、函数规则
1. 每个函数都应具有明确的输入和输出参数,参数类型和数量应在函数声明中明确。
2. 函数应具有明确的返回值类型,并在函数体中返回相应的值。
3. 函数内部应遵循模块化设计原则,将复杂的问题分解为简单的问题进行处理。
4. 函数命名应具有明确的意义,能够清晰地表达函数的用途。
五、内存管理规则
1. C语言中的内存管理需要程序员手动进行,包括内存的申请和释放。
2. 动态内存分配使用malloc() 和free() 函数进行申请和释放。
3. 静态内存分配在程序编译时确定,不需要手动释放。
4. 内存管理需要注意内存泄漏和野指针等问题,避免对程序造成影响。
c语言编程规范
c语言编程规范C语言是一种广泛使用的编程语言,为了使代码可读性强,易于维护,编写出高质量的C语言代码,需要遵守一些编程规范。
1. 命名规范:- 使用有意义的变量和函数名称,避免使用缩写或不明确的名称。
- 变量和函数名称使用小驼峰式命名,以单词首字母小写,后续的单词首字母大写。
- 宏常量使用全部大写字母,并用下划线分隔单词。
2. 注释规范:- 使用注释来解释代码的逻辑、功能或者算法,提高代码的可读性。
- 在函数开头可以用注释来描述函数的输入、输出及功能。
- 注释应该与代码对齐,避免过长或过短,同时避免注释代码。
3. 缩进和空格规范:- 使用合适的缩进,增加代码的可读性。
- 使用4个空格作为一次缩进,而不是使用Tab字符。
- 在运算符和逗号后加一个空格,使代码更易读。
- 在大括号前加一个空格,与控制流语句对齐。
4. 代码结构规范:- 将相关功能的代码块放在一起,便于阅读和维护。
- 逻辑层次清晰,函数和类方法要尽量短小,每个函数的功能单一、复用性强。
- 相关联的变量放在一起声明,并按照类型顺序排序。
- 避免过长的行,推荐每行代码不超过80个字符。
5. 错误处理规范:- 在代码中检查错误并进行适当的处理,避免代码崩溃或者产生不可预料的结果。
- 使用错误码或者异常来处理错误,避免使用魔法数字。
- 使用合适的方式记录错误信息,方便调试和定位问题。
6. 动态内存管理规范:- 在使用动态内存分配时,需要及时释放分配的资源,避免内存泄漏。
- 需要注意避免指针悬挂和使用已经释放的内存。
7. 注重效率和安全性:- 在编写代码时注重代码的性能和效率,避免使用低效的算法。
- 在处理用户输入或者系统API调用时,需要对输入进行有效性检查,避免安全漏洞。
8. 一致性和规范性:- 保持代码的一致性和规范性,遵循编程规范,方便团队协作和代码维护。
- 遵循公司或项目的编码规范,保持团队的代码风格一致。
以上是C语言编程规范的一些基本要点,通过遵守这些规范,可以提高代码的可读性、可维护性和代码质量,使得代码更加规范和高效。
C编程规范
C编程规范C语言编程规范规则:编程时强制必须遵守的约定原则:编程时必须坚持的指导思想建议:编程时必须加以考虑的约定1. 头文件原则1.1 头文件中合适放置接口的声明,不适合放置实现。
头文件是模块或单元的对外接口,头文件中应放置对外部的声明,如对外提供的函数声明,宏定义,类型定义使用前置声明减少#include,尽量是依赖声明而非依赖定义原则1.2 头文件应当职责单一原则1.3 头文件应向稳定的方向包含头文件的包含关系是一种依赖,一般来说应当让不稳定的模块依赖稳定的模块,当不稳定的模块修改变化时不会影响稳定的模块规则1.1 每个.c文件应当有一个同名的.h文件,用于声明对外公开的接口如果不需要对外使用则只在.c中定义使用static约束规则1.2 禁止头文件循环依赖,最佳是单向依赖规则1.3 .c和.h文件禁止包含用不到的头文件规则1.4 头文件应当自包含规则1.5 防止头文件被多次包含,使用#define来保护,为每个头文件配置一个宏,当第一次被包含的时候定义这个宏命名格式PROJECT_PATH_FILENAME_H规则1.6 禁止在头文件里定义变量规则1.7 只能通过包含头文件的方式使用其他.c提供的接口,禁止通过extern的方式使用外部函数接口和变量建议1.1 目录名为模块名,每个模块提供一个.h文件,文件名为目录名,对外提供模块的接口2. 函数原则2.1 一个函数仅完成一个功能原则2.2 重复代码应尽可能提炼成函数规则2.1 避免函数过长,建议在50行左右规则2.2 避免函数代码块嵌套过深,不要超4层规则2.3 可重入函数应避免共享变量,若要使用应通过互斥收到对其保护规则2.4 参数的合法性应由接口函数负责,为了增强安全性,调用者可以先进行校验,规则2.5 对函数的错误返回码要全面处理规则2.6 废弃代码及时清除建议2.1 函数不变参数使用const建议2.2 源文件范围内声明和定义的所有函数,除非外部可见,否则应增加static关键字建议2.3 函数的参数个数不要太多,不超5个3. 标识符命名和定义原则3.1 标识符使用unix风格,单词用小写字母,每个单词用'_'连接原则3.2 命名要清晰,有明确含义,正确使用反义词组命名具有互斥意义的变量和函数规则3.1 文件名统一采用小写字符规则3.2 使用名词或形容词+名词方式命名变量,使用动词或动词+名词命名函数规则3.3 用宏定义常量数字或字符串时,用大小字母命名宏和枚举,宏不要用'_'开头,全局变量加'g'建议3.1 尽量避免名字中出现数字4. 变量原则4.1 一个变量只有一个功能,不要用作多用途原则4.2 结构功能单一,不要面面俱到的数据结构,适度灵活原则4.3 不用或少用全局变量规则4.1 防止局部变量与全局变量同名规则4.2 网络通讯过程中使用结构必须注意字节序。
C语言程序设计规范
C语言程序设计规范一、注释规范在C语言程序中,注释是非常重要的。
注释可以帮助开发人员理解代码,更好的维护、修改程序。
因此,在编写C语言程序时,注释必须写得清晰明了。
1. 注释格式注释应当采用如下的格式:// 这是单行注释/** 这是多行注释*/2. 注释内容注释的内容应当包括:- 代码的作用- 变量名和函数名的含义- 重要的数据结构3. 注释位置注释应当在代码上方或者在代码旁边进行添加,这可以使得程序更加易读且易于理解。
二、命名规范命名是程序开发中的重要部分。
一个好的命名可以提高代码的可读性和可维护性。
C语言的命名规范应当遵循以下原则:1. 变量名应当使用小写字母,不要使用下划线。
2. 函数名第一个单词应当使用动词,第二个单词应当使用名词。
3. 常量名应当使用大写字母和下划线,如MAX_COUNT。
4. 枚举类型应当使用大写字母,如:typedef enum {RED,GREEN,BLUE} Color;5. 结构体名应当采用驼峰命名法,如:typedef struct {char firstName[20];char lastName[20];} Person;6. 文件名应当使用小写字母和下划线,如my_program.c。
三、缩进规范缩进可以使代码更易于阅读和理解,因此在编写程序时一定要遵循缩进规范。
1. 使用4个空格缩进,而不是使用制表符或两个空格缩进。
2. 如果某一行代码过长,可以在适当的位置断开,如:int result = some_function(param1, param2, param3,param4, param5);3. 对于控制结构(if、while、for等),应当缩进一级,如:if (condition) {// some code}while (condition) {// some code}四、代码风格规范代码的风格对于程序的可读性有着非常重要的影响。
C语言的代码风格规范应当遵循以下原则:1. 大括号应该单独占据一行。
c语言的三套标准
c语言的三套标准C语言最初由DennisRitchie于1969年到1973年在AT&T贝尔实验室里开发出来,主要用于重新实现Unix操作系统。
此时,C语言又被称为K&RC。
其中,K表示Kernighan的首字母,而R则是Ritchie的首字母。
K&RC语言与后来标准化的C语言有很大差异,比如:如果函数返回类型为int,则int可省:intmy_function(){}也可以写成my_function(){}编译器不会有任何警告,更不会报错。
还有现在看来比较奇葩的函数定义,像我们现在定义这么一个函数:voidmy_function(inta,char*p){}如果是用K&RC语法定义的话要写成:voidmy_function(a,p)inta;char*p;{}K&R的C语法中,定义一个函数时,其形参列表先列出形参的标识符,然后在函数声明的后面紧跟着对形参标识符的完整声明,最后是函数体。
这在现行标准中已经被逐步废弃使用了。
另外,当时的第一本C语言专业书《TheCProgrammingLanguage》也并非一个正式的编程语言规范,但被用了许多年。
C90标准由于C语言被各大公司所使用(包括当时处于鼎盛时期的IBMPC),因此到了1989年,C语言由美国国家标准协会(ANSI)进行了标准化,此时C语言又被称为ANSIC。
而仅过一年,ANSIC就被国际标准化组织ISO给采纳了。
此时,C语言在ISO中有了一个官方名称——ISO/IEC9899:1990。
其中:9899是C语言在ISO标准中的代号,像C++在ISO标准中的代号是14882;而冒号后面的1990表示当前修订好的版本是在1990年发布的。
对于ISO/IEC9899:1990的俗称或简称,有些地方称为C89,有些地方称为C90,或者C89/90。
不管怎么称呼,它们都指代这个最初的C语言国际标准。
这个版本的C语言标准作为K&RC的一个超集(即K&RC是此标准C的一个子集),把后来引入的许多非官方特性也一起整合了进去。
c语言编程规范
c语言编程规范C语言编程规范是指在使用C语言进行编程时应该遵循的一系列规定和标准。
在编写C语言程序时,遵循统一的编程规范可以提高代码的可读性、可维护性、可移植性和可靠性。
下面是一些常见的C语言编程规范,供大家参考和遵循。
1. 命名规范在C语言中,变量、函数、常量、宏等的命名应具有一定的规范性,以方便他人理解和阅读代码。
一般来说,命名应该尽量做到以下几点:- 变量和函数名使用小写字母,如果是多个单词组成,可以使用下划线 `_` 进行连接,如 `my_variable`。
- 宏常量使用全大写字母,并使用下划线 `_` 进行连接,如`MAX_SIZE`。
- 类型名和结构体名使用首字母大写的驼峰命名法,如 `MyStruct`。
- 全局变量和静态变量以 `g_` 开头,如 `g_count`。
- 局部变量使用有意义的名词或者简洁明了的单词缩写,如 `i` 表示整数变量,`ptr` 表示指针变量等。
2. 缩进与对齐在书写代码时,正确的缩进和对齐可以提高代码的可读性,让代码结构更加清晰。
通常使用4个空格进行缩进,并且在各个代码块之间使用空行进行分隔。
3. 注释规范注释是代码中必不可少的一部分,它可以解释代码的功能、逻辑和用法,便于其他人阅读和理解。
在编写注释时应尽量做到以下几点:- 使用自然语言进行注释,注释的内容要清晰明了,让其他开发人员容易理解。
- 对于复杂的逻辑或者算法,可以在代码旁边用注释进行解释。
- 对于不常见的技术或者特殊情况,可以在代码中加上注释进行说明。
- 尽量避免使用废弃的注释,及时更新和维护注释。
4. 函数规范函数是程序中的基本组成单元,编写规范的函数可以提高代码的可读性和可维护性。
在编写函数时应尽量做到以下几点:- 函数应该有明确的功能和目的,并且函数名要能够准确反映其功能。
- 函数的参数应该尽量避免过多,如果参数较多,可以考虑使用结构体传递参数。
- 函数应该尽量遵循单一职责原则,即一个函数只完成一个功能。
C语言中的代码规范与风格指南
C语言中的代码规范与风格指南在编写C语言代码时,遵循一定的代码规范和风格是非常重要的,因为良好的代码规范和风格可以提高代码的可读性、可维护性和可靠性。
本文将介绍一些常用的C语言代码规范和风格指南,帮助你写出高质量的C语言代码。
1. 缩进和空格:在C语言中,通常使用空格或制表符来进行缩进,建议使用4个空格来进行缩进,而不是制表符。
缩进可以使代码结构更清晰,便于阅读和理解。
2. 变量命名:变量命名应具有描述性,能够清晰地表达变量的用途。
通常采用驼峰命名法或下划线命名法,确保变量名简洁明了,避免使用单个字母或无意义的缩写。
3. 函数和类命名:函数和类的命名应该具有描述性,能够清晰地表达函数或类的功能。
同样,采用驼峰命名法或下划线命名法,并且避免使用单个字母或无意义的缩写。
4. 注释:在代码中添加适当的注释是很有必要的,可以帮助其他人理解你的代码。
注释应该清楚简洁,解释代码的用途和功能,而不是重复代码本身。
注释应该使用英文书写,可以在每行代码末尾添加注释,也可以在代码块之上添加注释。
5. 括号和空格:在C语言中,通常要求在控制结构(如if、for、while等)的左括号前加一个空格,在右括号后也加一个空格。
这有助于代码的可读性,使代码更加整洁。
6. 单行代码长度:尽量避免单行代码过长,一般建议不超过80个字符。
如果一行代码过长,可以考虑将其分成多行,以提高代码的可读性。
7. 常量命名:常量命名通常使用大写字母和下划线,以便与变量区分。
在定义常量时,应该使用const关键字明确指定,避免出现魔法数字。
8. 函数长度:编写函数时,尽量保持函数长度的可控制性,避免函数过长。
如果函数过长,可以考虑将其拆分成多个函数,提高代码的可维护性。
9. 错误处理:在代码中添加适当的错误处理是非常重要的,可以保证程序的稳定性和可靠性。
应该考虑所有可能出现的错误情况,并进行适当处理,包括错误码返回、异常处理等。
总之,遵循良好的代码规范和风格指南可以帮助我们编写出高质量、易读、易维护的C语言代码。
C语言编程风格和规范
C语言编程风格和规范C语言是一种广泛应用于系统级编程和嵌入式开发的高级编程语言。
为了保证代码的可读性和可维护性,程序员应当遵循一定的编程风格和规范。
本文将介绍一些常见的C语言编程风格和规范。
一、命名规范在C语言中,良好的命名风格可以提升代码可读性。
以下是一些常见的命名规范:1. 变量和函数名使用小写字母,单词之间用下划线(_)分隔,例如:my_variable。
2. 结构体和枚举类型采用首字母大写的驼峰命名法,例如:MyStruct。
3. 宏定义使用全大写字母,单词之间用下划线(_)分隔,例如:MY_MACRO。
二、缩进和空格良好的缩进和空格使用可以使代码结构清晰,提高可读性。
以下是一些常见的缩进和空格规范:1. 使用两个空格或者一个制表符进行代码缩进。
2. 操作符前后加空格,例如:a = b + c。
3. 函数名和左圆括号之间不加空格,例如:printf("Hello World")。
三、注释规范注释对于代码的理解和维护非常重要。
以下是一些关于注释的规范:1. 对于复杂的算法或者重要的函数,应当提供函数头部的注释来解释函数的功能、输入输出参数等。
2. 使用//或者/* ... */来添加注释,简洁明了。
3. 不要在注释中使用绝对的数字或者日期表示,应使用相对的描述,例如:3个元素或者最近更新。
四、函数和模块规范函数和模块的设计可以帮助提高代码的可读性和可维护性。
以下是一些相关的规范:1. 函数应当尽量短小,一个函数只做一件事情。
2. 函数应当有清晰的参数和返回值,避免使用全局变量。
3. 模块应当有清晰的接口定义和模块内部的实现,尽量减少对外部变量和函数的依赖。
五、错误处理规范良好的错误处理可以提高代码的健壮性和可靠性。
以下是一些常见的错误处理规范:1. 函数应当返回适当的错误码或者错误标志,用于外部处理错误情况。
2. 错误处理的代码应当尽量短小,避免嵌套过深的if语句。
3. 错误处理的输出信息应当清晰明了,帮助定位问题。
C语言编程规范
编码规范1. 头文件编码规范 (2)2. 函数编写规范 (2)3. 标识符命名与定义 (2)3.1通用命名规则 (2)3.2 变量命名规则 (3)3.3函数命名规则 (3)3.4 宏的命名规则 (3)4. 变量 (3)5. 宏、常量 (4)6. 质量保证 (4)7. 程序效率 (5)8. 注释 (5)9. 排版与格式 (6)10. 表达式 (7)11. 代码编辑、编译 (7)12. 安全性 (7)13. 可读性 (7)14. 可测性 (7)15. 单元测试 (8)16. 可移植性 (8)1. 头文件编码规范1. 禁止头文件循环依赖。
2. .c/.h文件不要包含用不到的头文件。
3. 禁止在头文件中定义变量。
4. 同一产品统一包含头文件排列方式。
(如功能块排序、文件名升序、稳定度排序。
)5. 只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量。
2. 函数编写规范1. 一个函数仅完成一件功能。
2. 重复代码应该尽可能提炼成函数。
3.为简单功能编写函数4.函数的返回值要清楚、明了,让使用者不容易忽视错误情况。
5. 避免函数过长,新增函数不超过100行(非空非注释行)。
6. 避免函数的代码块嵌套过深,新增函数的代码块嵌套不超过4层。
7. 可重入函数应避免使用全局变量和禁止使用static变量。
8. 设计高扇入,合理扇出(小于7)的函数。
9. 废弃代码(没有被调用的函数和变量)要及时注释(有助于更好理解程序)。
10. 对所调用函数的错误返回码要仔细、全面地处理。
11. 函数不变参数使用const。
12. 函数应避免使用全局变量、静态局部变量和I/O操作,不可避免的地方应集中使用。
13. 函数的参数个数不超过5个。
14. 减少或禁止函数本身或函数间的递归调用3. 标识符命名与定义3.1通用命名规则1. 标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。
经典C编程规范完整篇
2 注释
C语言编程规范
注释
1
2-1:一般情况下,源程序有效注释量必须在20%以上。
2
C语言编程规范
2 注释
C语言编程规范
/************************************************* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: // 文件名 Author: Version: Date: // 作者、版本及完成日期 Description: // 用于详细说明此程序文件完成的主要功能,与其他模块 // 或函数的接口,输出值、取值范围、含义及参数间的控 // 制、顺序、独立或依赖等关系 Others: // 其它内容的说明 Function List: // 主要函数列表,每条记录应包括函数名及功能简要说明 1. .... History: // 修改历史记录列表,每条修改记录应包括修改日期、修改 // 者及修改内容简述 1. Date: Author: Modification: 2. ... *************************************************/
应如下书写 for (...) { ... // program code } if (...) { ... // program code } void example_fun( void ) { ... // program code }
C语言编程规范
1 排版
1-11:在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。 说明:采用这种松散方式编写代码的目的是使代码更加清晰。 由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格.如括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。 在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。给操作符留空格时不要连续留两个以上空格。
c语言编程规范-命名规则
c语言编程规范-命名规则C是一门朴素的语言,你使用的命名也应该这样。
与Modula-2和Pascal程序员不同,C程序员不使用诸如“ThisVariableIsAT emporaryCounter”这样“聪明”的名字。
C程序员应该叫它“tmp”,这写起来更简单,也不会更难懂。
然而,当面对复杂情况时就有些棘手,给全局变量取一个描述性的名字是必要的。
把一个全局函数叫做“foo”是一种目光短浅的行为。
全局函数也一样,如果你有一个统计当前用户个数的函数,应当把它命名为“count_active_user()”或者简单点些的类似名称,不应该命名为“cntusr()”。
3.1 三种流行的命名法则目前,业界共有四种命名法则:驼峰命名法、匈牙利命名法、帕斯卡命名法和下划线命名法,其中前三种是较为流行的命名法。
(1)驼峰命令法。
正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。
例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:printEmployeePaychecks();print_employee_paychecks();第一个函数名使用了驼峰命名法,函数名中的每一个逻辑断点都有一个大写字母来标记。
第二个函数名使用了下划线法,函数名中的每一个逻辑断点都有一个下划线来标记。
驼峰命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多。
另一方面,下划线法是C 出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍。
(2)匈牙利命名法。
广泛应用于象Microsoft Windows这样的环境中。
Windows 编程中用到的变量(还包括宏)的命名规则为匈牙利命名法,这种命名技术是由一位能干的 Microsoft 程序员查尔斯-西蒙尼(Charles Simonyi) 提出的。
匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等。
c语言编程规约
C语言编程规约(内部使用)拟制:日期:审核:日期:审核:日期:批准:日期:修订记录前言编程规约应建立与一项工程支出,且该规约应贯穿整个工程之始终。
采用一些规约有助于提供劳动生产率,并使团队工程软件便于维护。
惯用的、号的书写风格以及他人用的一些好方法。
可以达到以下目的:●可移植性好●兼容性好●干净整齐●易维护性好●易看懂●简明扼要无论采用什么样的编程风格,必须在整个工程中采用始终如一的格式。
对于一项大工程的整个团队建议使用同一的编程风格。
所以,本团队试用一下C语言编程规约来规范程序的书写方法。
采用共同的编写风格,可以少发生一些程序维护中令人头痛的事情,降低维护成本;采用统一的书写方法有助于避免代码的重复编写。
C源代码的宽度限制在80个字符。
使用Fixedsys字体9号字。
源代码超出部分需要将源代码分成两行书写且将注释书写于头上。
除了必要的英文外,本团队约定所有注释一律使用中文。
不得使用英文及其它语言。
新来的团队人员在编写代码前应先认真阅读本规约。
以便快速了解和掌握本关于软件编写规范。
一、文件头以下是C语言程序的文件头。
公司的名称和地址可写在前几行;然后是标题,标出文件的主题内容;接着是著作权声明,以表明软件的专有权。
然后是关于侵权的警告说明及购买本软件的联系方式。
/****************************************************************************** * XXXXXXXX有限公司* CN_uOS实时操作系统** 此文件属于CN_uOS实时操作系统的一个子文件,XXXXXXXX有限公司对其有所有版* 权及保留意见。
任何复制和发布本软件的公司及个人,我们将对其追究最终法律责任。
* 需要使用部分或全部软件代码的公司及个人需同XXXXXXXX有限公司联系。
* 网址:** 文件名:* 版本:* 描述:* 作者:* 日期:* 函数列表:******************************************************************************/二、文件包含应用工程需要的头文件紧跟在版本变更记录的后面。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Best practices for programming in CShiv Dutta, Technical Consultant, IBM, Software GroupGary Hook(ghook@), Senior Technical Consultant, IBM, Software GroupSummary: Although the C language has been around for close to 30 years, its appeal has not yet worn off. It continues to attract a large number of people who must develop new skills for writing new applications, or for porting or maintaining existing applications.IntroductionThis article has been written with the needs of the developer in mind. We have put together a set of guidelines that have served us well as developers and consultants over the years, and we offer these as suggestions that may help you in your job. You may not agree with all of them but our hope is you would like some of them and use them in your programming or porting projects.Back to topStyles and Guidelines•Use a source code style that makes the code readable and consistent.Unless you have a group code style or a style of your own, you could use a style similar to the Kernighan and Ritchie style used by a vast majority of C programmers. Taken to an extreme, however, it's possible to end up with something like this:inti;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o,world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);••--Dishonorable mention, Obfuscated C Code Contest, 1984. Author requested anonymity.•It is common to see the main routine defined as main(). The ANSI way of writing this is int main(void) (if there are is no interest in the command line arguments) or as int main( int argc, char**argv ). Pre-ANSI compilers would omit the void declaration, or list the variable names and follow with their declarations. •WhitespaceUse vertical and horizontal whitespace generously. Indentation and spacing should reflect the block structure of the code.A long string of conditional operators should be split onto separatelines. For example:if (foo->next==NULL && number < limit && limit <=SIZE&& node_active(this_input)) {...might be better as:if (foo->next == NULL&& number < limit && limit <= SIZE&& node_active(this_input)){...Similarly, elaborate for loops should be split onto different lines:for (curr = *varp, trail = varp;curr != NULL;trail = &(curr->next), curr = curr->next ){...Other complex expressions, such as those using the ternary ?: operator, are best split on to several lines, too.z = (x == y)? n + f(x): f(y) - n;•CommentsThe comments should describe what is happening, how it is being done, what parameters mean, which globals are used and any restrictions or bugs. However, avoid unnecessary comments. If the code is clear, and uses good variable names, it should be able to explain itself well. Since comments are not checked by the compiler, there is no guarantee they are right. Comments that disagree with the code are of negative value. Too many comments clutter code.Here is a superfluous comment style:i=i+1; /* Add one to i */It's pretty clear that the variable i is being incremented by one.And there are worse ways to do it:/************************************* ** Add one to i ** *************************************/ i=i+1;•Naming ConventionsNames with leading and trailing underscores are reserved for system purposes and should not be used for any user-created names.Convention dictates that:1.#define constants should be in all CAPS.2.enum constants are Capitalized or in all CAPS3.Function, typedef, and variable names, as well as struct,union, and enum tag names should be in lower case.For clarity, avoid names that differ only in case, like foo and Foo .Similarly, avoid foobar and foo_bar. Avoid names that look like each other. On many terminals and printers, 'l', '1' and 'I' look quitesimilar. A variable named 'l' is particularly bad because it looks so much like the constant '1'.•Variable namesWhen choosing a variable name, length is not important but clarity of expression is. A long name can be used for a global variable which is rarely used but an array index used on every line of a loop need not be named any more elaborately than i. Using 'index' or'elementnumber' instead is not only more to type but also can obscure the details of the computation. With long variable names sometimes it is harder to see what is going on. Consider:for(i=0 to 100)array[i]=0versusfor(elementnumber=0 to 100)array[elementnumber]=0;•Function namesFunction names should reflect what they do and what they return.Functions are used in expressions, often in an if clause, so they need to read appropriately. For example:if (checksize(x))is unhelpful because it does not tell us whether checksize returns true on error or non-error; instead:if (validsize(x))makes the point clear.•DeclarationsAll external data declaration should be preceded by the extern keyword.The "pointer'' qualifier, '*', should be with the variable name rather than with the type.char *s, *t, *u;instead ofchar* s, t, u;The latter statement is not wrong, but is probably not what is desired since 't' and 'u' do not get declared as pointers.•Header FilesHeader files should be functionally organized, that is,declarations for separate subsystems should be in separate header files. Also, declarations that are likely to change when code is ported from one platform to another should be in a separate header file.Avoid private header filenames that are the same as library header filenames. The statement #include "math.h'' includes the standard library math header file if the intended one is not found in the current directory. If this is what you want to happen, comment this fact.Finally, using absolute pathnames for header files is not a good idea. The "include-path'' option of the C compiler (-I (capital "eye") on many systems) is the preferred method for handling extensive private libraries of header files; it permitsreorganizing the directory structure without having to alter source files.•scanfscanf should never be used in serious applications. Its error detection is inadequate. Look at the example below:#include <stdio.h>int main(void){int i;float f;printf("Enter an integer and a float: ");scanf("%d %f", &i, &f);printf("I read %d and %f\n", i, f);return 0;}Test runEnter an integer and a float: 182 52.38I read 182 and 52.380001Another TEST runEnter an integer and a float: 6713247896 4.4I read -1876686696 and 4.400000•++ and --When the increment or decrement operator is used on a variable ina statement, that variable should not appear more than once in thestatement because order of evaluation is compiler-dependent. Do not write code that assumes an order, or that functions as desired on one machine but does not have a clearly defined behavior:int i = 0, a[5];a[i] = i++; /* assign to a[0]? or a[1]? */•Don't let yourself believe you see what isn't there.Look at the following example:while (c == '\t' || c = ' ' || c == '\n')c = getc(f);The statement in the while clause appears at first glance to be validC. The use of the assignment operator, rather than the comparisonoperator, results in syntactically incorrect code. The precedence of = is lowest of any operator so it would have to be interpreted this way (parentheses added for clarity):while ((c == '\t' || c) = (' ' || c == '\n'))c = getc(f);The clause on the left side of the assignment operator is:(c == '\t' || c)which does not result in an lvalue. If c contains the tab character, the result is "true" and no further evaluation is performed, and "true" cannot stand on the left-hand side of an assignment.•Be clear in your intentions.When you write one thing that could be interpreted for something else, use parentheses or other methods to make sure your intent is clear. This helps you understand what you meant if you ever have to deal with the program at a later date. And it makes things easier if someone else has to maintain the code.It is sometimes possible to code in a way that anticipates likely mistakes. For example, you can put constants on the left of equality comparisons. That is, instead of writing:while (c == '\t' || c == ' ' || c == '\n')c = getc(f);You can say:while ('\t' == c || ' ' == c || '\n' == c)c = getc(f);This way you will get a compiler diagnostic:while ('\t' = c || ' ' == c || '\n' == c)c = getc(f);This style lets the compiler find problems; the above statement is invalid because it tries to assign a value to '\t'.•Trouble from unexpected corners.C implementations generally differ in some aspects from each other.It helps to stick to the parts of the language that are likely to be common to all implementations. By doing that, it will be easier to port your program to a new machine or compiler and less likely that you will run into compiler idiosyncracies. For example, consider the string:/*/*/2*/**/1This takes advantage of the "maximal munch" rule. If comments nest, it is interpreted this way:/* /* /2 */ * */ 1The two /* symbols match the two */ symbols, so the value of this is 1. If comments do not nest, on some systems, a /* in a commentis ignored. On others a warning is flagged for /*. In either case, the expression is interpreted this way:/* / */ 2 * /* */ 12 * 1 evaluates to 2.•Flushing Output BufferWhen an application terminates abnormally, the tail end of its output is often lost. The application may not have the opportunity to completely flush its output buffers. Part of the output may still be sitting in memory somewhere and is never written out. On some systems, this output could be several pages long.Losing output this way can be misleading because it may give the impression that the program failed much earlier than it actually did. The way to address this problem is to force the output to be unbuffered, especially when debugging. The exact incantation for this varies from system to system but usually looks something like this:setbuf(stdout, (char *) 0);This must be executed before anything is written to stdout. Ideally this could be the first statement in the main program.•getchar() - macro or functionThe following program copies its input to its output:#include <stdio.h>int main(void){register int a;while ((a = getchar()) != EOF)putchar(a);}Removing the #include statement from the program would cause it to fail to compile because EOF would then be undefined.We can rewrite the program in the following way:#define EOF -1int main(void){register int a;while ((a = getchar()) != EOF)putchar(a);}This will work on many systems but on some it will run much more slowly.Since function calls usually take a long time, getchar is often implemented as a macro. This macro is defined in stdio.h, so when #include <stdio.h> is removed, the compiler does not know what getchar is. On some systems it assumes that getchar is a function that returns an int.In reality, many C implementations have a getchar function in their libraries, partly to safeguard against such lapses. Thus insituations where #include <stdio.h> is missing the compiler uses the function version of getchar. Overhead of function call makes the program slower. The same argument applies to putchar.•null pointerA null pointer does not point to any object. Thus it is illegal touse a null pointer for any purpose other than assignment and comparison.Never redefine the NULL symbol. The NULL symbol should always havea constant value of zero. A null pointer of any given type willalways compare equal to the constant zero, whereas comparison witha variable with value zero or to some non-zero constant hasimplementation-defined behaviour.Dereferencing a null pointer may cause strange things to happen. •What does a+++++b mean?The only meaningful way to parse this is:a ++ + ++ bHowever, the maximal munch rule requires it to be broken down as:a ++ ++ + bThis is syntactically invalid: it is equivalent to:((a++)++) + bBut the result of a++ is not an lvalue and hence is not acceptable as an operand of ++. Thus the rules for resolving lexical ambiguity make it impossible to resolve this example in a way that issyntactically meaningful. In practice, of course, the prudent thing to do is to avoid construction like this unless you are absolutely certain what they mean. Of course, adding whitespace helps the compiler to understand the intent of the statement, but it is preferable (from a code maintenance perspective) to split this construct into more than one line:++b;(a++) + b;•Treat functions with careFunctions are the most general structuring concept in C. They should be used to implement "top-down" problem solving - namely breaking up a problem into smaller and smaller subproblems until each piece is readily expressed in code. This aids modularity anddocumentation of programs. Moreover, programs composed of many small functions are easier to debug.Cast all function arguments to the expected type if they are not of that type already, even when you are convinced that this is unnecessary since they may hurt you when you least expect it. In other words, the compiler will often promote and convert data types to conform to the declaration of the function parameters. But doing so manually in the code clearly explains the intent of theprogrammer, and may ensure correct results if the code is ever ported to another platform.If the header files fail to declare the return types of the library functions, declare them yourself. Surround your declarations with #ifdef/#endif statements in case the code is ever ported to another platform.Function prototypes should be used to make code more robust and to make it run faster.•Dangling elseStay away from "dangling else" problem unless you know what you're doing:if (a == 1)if (b == 2)printf("***\n");elseprintf("###\n");The rule is that an else attaches to the nearest if. When in doubt, or if there is a potential for ambiguity, add curly braces to illuminate the block structure of the code.•Array boundsCheck the array bounds of all arrays, including strings, since where you type "fubar'' today someone someday may type"floccinaucinihilipilification". Robust production softwareshould not use gets().The fact that C subscripts start from zero makes all kinds of counting problems easier. However, it requires some effort to learn to handle them.•Null statementThe null body of a for or while loop should be alone on a line and commented so that it is clear that the null body is intentional and not missing code.while (*dest++ = *src++); /* VOID */•Test for true or falseDo not default the test for non-zero, that is:if (f() != FAIL)is better thanif (f())even though FAIL may have the value 0 which C considers to be false.(Of course, balance this against constructs such as the one shown above in the "Function Names" section.) An explicit test will help you out later when somebody decides that a failure return should be -1 instead of 0.A frequent trouble spot is using the strcmp function to test forstring equality, where the result should never be defaulted. The preferred approach is to define a macro STREQ:#define STREQ(str1, str2) (strcmp((str1), (str2)) == 0)Using this, a statement such as:If ( STREQ( inputstring, somestring ) ) ...carries with it an implied behavior that is unlikely to change under the covers (folks tend not to rewrite and redefine standard library functions like strcmp()).Do not check a boolean value for equality with 1 (TRUE, YES, etc.);instead test for inequality with 0 (FALSE, NO, etc.). Most functions are guaranteed to return 0 if false, but only non-zero if true. Thus,if (func() == TRUE) {...is better writtenif (func() != FALSE)•Embedded statementThere is a time and a place for embedded assignment statements. In some constructs there is no better way to accomplish the results without resulting in bulkier and less readable code:while ((c = getchar()) != EOF) {process the character}Using embedded assignment statements to improve run-timeperformance is possible. However, you should consider the tradeoff between increased speed and decreased maintainability that results when embedded assignments are used in artificial places. Forexample:x = y + z;d = x + r;should not be replaced by:d = (x = y + z) + r;even though the latter may save one cycle. In the long run the time difference between the two will decrease as the optimizer isenhanced, while the difference in ease of maintenance willincrease.•goto statementsgoto should be used sparingly. The one place where they can be usefully employed is to break out of several levels of switch,for, and while nesting, although the need to do such a thing may indicate that the inner constructs should be broken out into a separate function.for (...) {while (...) {...if (wrong)goto error;}}...error:print a messageWhen a goto is necessary the accompanying label should be alone ona line and either tabbed one stop to the left of the code that follows,or set at the beginning of the line. Both the goto statement and target should be commented to their utility and purpose.•Fall-though in switchWhen a block of code has several labels, place the labels on separate lines. This style agrees with the use of vertical whitespace, and makes rearranging the case options a simple task, should that be required. The fall-through feature of the C switch statement must be commented for future maintenance. If you've ever been "bitten"by this feature, you'll appreciate its importance!switch (expr) {case ABC:case DEF:statement;break;case UVW:statement; /*FALLTHROUGH*/case XYZ:statement;break;}While the last break is technically unnecessary, the consistency of its use prevents a fall-through error if another case is later added after the last one. The default case, if used, should always be last and does not require a final break statement if it is last.•ConstantsSymbolic constants make code easier to read. Numerical constants should generally be avoided; use the #define function of the C preprocessor to give constants meaningful names. Defining the value in one place (preferably a header file) also makes it easier to administer large programs since the constant value can be changed uniformly by changing only the define. Consider using theenumeration data type as an improved way to declare variables that take on only a discrete set of values. Using enumerations also lets the compiler warn you of any misuse of an enumerated type. At the very least, any directly-coded numerical constant must have a comment explaining the derivation of the value.Constants should be defined consistently with their use; e.g. use 540.0 for a float instead of 540 with an implicit float cast. That said, there are some cases where the constants 0 and 1 may appear as themselves instead of as defines. For example if a for loop indexes through an array, then:for (i = 0; i < arraysub; i++)is quite reasonable, while the code:gate_t *front_gate = opens(gate[i], 7);if (front_gate == 0)error("can't open %s\n", gate[i]);is not. In the second example front_gate is a pointer; when a value is a pointer it should be compared to NULL instead of 0. Even simple values like 1 or 0 are often better expressed using defines like TRUE and FALSE (and sometimes YES and NO read better).Don't use floating-point variables where discrete values are needed.This is due to the inexact representation of floating point numbers (see the second test in scanf, above). Test floating-point numbers using <= or >=; an exact comparison (== or !=) may not detect an "acceptable" equality.Simple character constants should be defined as character literals rather than numbers. Non-text characters are discouraged asnon-portable. If non-text characters are necessary, particularly if they are used in strings, they should be written using a escape character of three octal digits rather than one (for example,'\007'). Even so, such usage should be considered machine-dependent and treated as such.•Conditional CompilationConditional compilation is useful for things likemachine-dependencies, debugging, and for setting certain options at compile-time. Various controls can easily combine in unforeseen ways. If you use #ifdef for machine dependencies, make sure that when no machine is specified, the result is an error, not a default machine. The #error directive comes in handy for this purpose. And if you use #ifdef for optimizations, the default should be theunoptimized code rather than an uncompilable or incorrect program.Be sure to test the unoptimized code.Back to topMiscellaneous•Utilities for compiling and linking such as Make simplify considerably the task of moving an application from one environment to another. During development, make recompiles only those modules that have been changed since the last time make was used.Use lint frequently. lint is a C program checker that examines C source files to detect and report type incompatibilities,inconsistencies between function definitions and calls, potential program bugs, etc.Also, investigate the compiler documentation for switches thatencourage it to be "picky". The compiler's job is to be precise, so let it report potential problems by using appropriate command line options.•Minimize the number of global symbols in the application. One of the benefits is the lower probability of conflicts withsystem-defined functions.•Many programs fail when their input is missing. All programs should be tested for empty input. This is also likely to help you understand how the program is working•Don't assume any more about your users or your implementation than you have to. Things that "cannot happen" sometimes do happen. A robust program will defend against them. If there's a boundarycondition to be found, your users will somehow find it!Never make any assumptions about the size of a given type,especially pointers.When char types are used in expressions most implementations will treat them as unsigned but there are others which treat them as signed. It is advisable to always cast them when used in arithmetic expressions.Do not rely on the initialization of auto variables and of memory returned by malloc.•Make your program's purpose and structure clear.•Keep in mind that you or someone else will likely be asked to modify your code or make it run on a different machine sometime in the future. Craft your code so that it is portable to other machines. Back to topConclusionIt is a common knowledge that the maintenance of applications takes a significant amount of a programmer's time. Part of the reason for thisis the use of non-portable and non-standard features and less than desirable programming style when developing applications. In this article we have presented some guidelines which have stood us in good stead over the years. We believe that these guidelines, when followed, will make application maintenance easier in a team environment.Back to topReference•Obfuscated C and Other Mysteries by Don Libes, John Wiley and Sons, Inc., ISBN 0-471-57805-3•The C Programming Language by Brian W. Kernighan and Dennis M.Ritchie, Second Edition, Prentice-Hall, ISBN 0-13-110370-9 •Safer C by Les Hatton, McGraw-Hill, ISBN 0-07-707640-0• C Traps and Pitfalls by Andrew Koenig, AT&T Bell Laboratories, ISBN 0-201-17928-9About the authorsShiv Dutta works as a Technical Consultant in the IBM Systems and Technology Group where he assists independent software vendors with the enablement of their applications on pSeries servers. Shiv was one of the co-authors of AIX 5L Differences Guide Version 5.3 Edition redbook and has considerable experience as a software developer, system administrator, and an instructor. He provides AIX support in the areas of system administration, problem determination, performance tuning, and sizing guides. Shiv has worked with AIX from its inception. He holds a Ph.D. in Physics from Ohio University and can be reached at sdutta@.Gary R. Hook is a senior technical consultant at IBM, providing application development, porting, and technical assistance to independent software vendors. Mr. Hook's professional experience focuses on Unix-based application development. Upon joining IBM in 1990, he worked with the AIX Technical Support center in Southlake, Texas, providing consulting and technical support services to customers, with an emphasis upon AIX application architecture. Now residing in Austin, Mr. Hook was a member of the AIX Kernel Development team from 1995 through 2000, specializing in the AIX linker, loader, and general application development tools. You can contact him at ghook@.。