【c程序】C语言编码规范

头文件:

1.头文件中适合放置接口的声明,不适合放置实现。

2.头文件应向稳定的方向包含,产品依赖于平台,平台依赖于标准库。

3. .c/.h文件禁止包含用不到的头文件。

4.每一个.c文件应有一个同名.h文件,用于声明需要对外公开的接口。

5.禁止头文件循环依赖。

6.头文件应当自包含(任意一个头文件均可独立编译)。

7.禁止在extern"C"中包含头文件。

8.禁止在头文件中定义变量,如果头文件被其他文件包含,会引发重复定义。

9.只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过extern的方式使用外部函数接口、变量。

10.如果一个模块包含多个子模块,则建议每一个子模块提供一个对外的.h,文件名为子模块名,降低接口使用者的编写难度。


编码:

1.函数不变参数使用const

2.全局变量应增加“g_”前缀。

3.静态变量应增加“s_”前缀。

4.在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字。

5.通讯过程中使用的结构,必须注意字节序。对于跨平台的交互,数据成员发送前,都应该进行主机序到网络序的转换;接收时,也必须进行网络序到主机序的转换。由于位域在不同字节序下,表现看起来差别更大,所以更需要注意。

6.函数调用不要作为另一个函数的参数使用,否则对于代码的调试、阅读都不利。

7.函数break,return时一定要注意资源的释放,比如释放申请的内存、释放锁。

8.禁止内存操作越界。坚持下列措施可以避免内存越界:

 (1)数组的大小要考虑最大情况,避免数组分配空间不够。

 (2)避免使用sprintf/vsprintf/strcpy/strcat/gets操作字符串,使用相对安全的函数snprintf/strncpy/strncat/fgets代替。

 (3)使用memcpy/memset时一定要确保长度不要越界。

 (4)字符串考虑最后的'\0'确保所有字符串是以'\0'结束。

 (5)指针加减操作时,考虑指针类型长度。

 (6)数组下标进行检查。

 (7)使用时sizeof或者strlen计算结构/字符串长度,避免手工计算。

9.禁止内存泄漏。坚持下列措施可以避免内存泄漏:

 (1)异常出口处检查内存、定时器/文件句柄/Socket/队列/信号量/GUI等资源是否全部释放。

 (2)删除结构指针时,必须从底层向上层顺序删除。

 (3)使用指针数组时,确保在释放数组时,数组中的每个元素指针是否已经提前被释放了。

 (4)避免重复分配内存

 (5)小心使用有returnbreak语句的宏,确保前面资源已经释放。

 (6)检查队列中每个成员是否释放。

10.禁止引用已经释放的内存空间。坚持下列措施可以避免引用已经释放的内存空间:

 (1)内存释放后,把指针置为NULL;使用内存指针前进行非空判断。

 (2)耦合度较强的模块互相调用时,一定要仔细考虑其调用关系,防止已经删除的对象被再次使用。

 (3)避免操作已发送消息的内存。

 (4)自动存储对象的地址不应赋值给其他的在第一个对象已经停止存在后仍然保持的对象(具有更大作用域的对象或者静态对象或者从一个函数返回的对象)。


1 排版规则 1) 程序应采用缩进风格编写,每层缩进使用一个制表位(TAB),类定义、方法都应顶格书写; 2) 源程序建议使用英文书写,尽量不含有中文。每行不超过80字符。对于较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分; 3) 左花括号要另起一行,不能跟在上一行的行末; 4) 一个变量定义占一行,一个语句占一行; 5) 对独立的程序块之间、变量说明之后必须加空行; 6) 在结构成员赋值等情况,等号对齐,最少留一个空格; 7) 若函数或过程中的参数较长,则要进行适当的划分。 8) 形参的排序风格:  最常使用的参数放在第一位;  输入参数列表应放在输出参数列表的左边;  将通用的参数放在特殊的参数的左边。 2 命名规范 2.1 应用程序的命名 “系统简称”+模块名称 2.2 子模块的命名 每个子模块的名字应该由描述模块功能的1-3以单词组成。每个单词的首字母应大写。在这些单词中可以使用一些较通用的缩写。 2.3 变量的命名 变量的命名的基本原则是使得变量的含义能够从名字中直接理解。可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越10行以上的变量名称不能少于4个字符,除循环变量,累加变量外不得使用I、j、k等名称的变量变量分为取全局变量和局部变量,对于全局变量以加前缀“g_”来区分。 使用有意义的英语单词,使用大小写分隔,每个单词的第一个字母为大写 标识符种类 书写规范 示 例 函数/过程名/变量 一般标识符 CheckButtonStates 宏标识符 大写标识符 SALES_TAX 类型定义 ‘T’+一般标识符 TMyType 类标识符 ‘C’+一般标识符 CEditBox 结构标识符 ‘S’+一般标识符 SMyStructure 联合标识符 ‘U’+一般标识符 UMyUnion 字符标识符 ‘c’+一般标识符 cReadKey 字符串标识符 ‘s’+一般标识符 sComputerName 整数标识符 ‘i/ui/l/ul’+一般标识符 iNumber, ulCurrent 浮点型标识符 ‘f/d’+一般标识符 fPrice,dMoney 逻辑标识符 ‘b’+一般标识符 bIsDetailed 对象标识符 特征小写字母+一般标识符 fMyStatus, tMyTree 指针变量 p+类型前缀+一般标识符 piCount 全局变量 g+类型前缀+一般标识符 giCount 类私有变量 f+类型前缀+一般标识符 fiCount 数据库变量 以m打头 miCount 考虑到习惯性和简洁性,对于按常规使用的局部变量允许采用极短的名字,如用n、i作为循环变量,p、q作为指针等。另外,要注意的是:全局变量程序中不要定义太多,能用局部变量的就用局部变量。如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数。 2.4 常量的命名 常量所有的字母均为大写。并且单词之间使用下划线”_”隔开。 2.5 函数/过程的命名 函数/过程名称应该尽量使用能够表达函数功能的英文名称,函数名称中应该禁止使用如同function1,function2等含义不清的名称。单词间应该使用大小写分隔。全局函数/过程名称以“g_”前缀开始。 2.6 接口命名 接口名称要以大写字母开头。如果接口包含多个单词,每个单词的首字母大写,其他字母小写,如果,这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写为Xml)。 2.7 类的命名 类名称要以大写字母开头; 类名称如果包含多个单词,每个单词的首字母要大写,其他字母小写;如果这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写作Xml); 类名称应该是一个名词或名词短语; 类成员变量的命名规则与上述规则相同,但是要以“m_”开始,表示其为成员变量(Member); 类名称不能出现下划线。 2.8 方法的命名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值