头文件
1.禁止头文件循环依赖
即不能出现多个.h文件形成 循环包含的情况。如:a.h包含b.h,b.h包含c.h. c.h包含a.h. 类似这种三者相互包含,这样就会导致修改其中一个.h文件,都会造成其他文件都需要重新 编译的情况
2.总是编写内部#include保护符(#defune 保护)
多次包含一个头文件的问题在人为上可以通过认真的设计来避免,如果我们水平未达到或无法避免,就需要采取阻止头文件内容被包含多于一次的机制。通常的手段是使用 #ifnden,#define,#endif. 去配置一个宏 来防止头文件被重复包含(具体操作不会找度娘)
3.只能通过包含头文件的方式使用其他.c提供的接口,禁止在.c中通过 extern的方式使用外部函数接口,变量。
即:禁止通过在a.c中直接写extern int foo(int input);来使用foo,这种写法容易在foo改变时可能导致声明和定义不一致。
函数
1.重复代码应该尽可能提炼成函数
重复代码提炼成函数可以带来维护成本的降低。
2.避免函数过长,新增函数不超过50行(有效代码段)
过长的函数往往意味着函数功能不单一,过于复杂。界普遍认为一个函数的代码行不要超 过一个屏幕,避免来回翻页影响阅读
3.可重入函数应避免使用共享变量;若需使用,则应通过互斥手段(关中断、信号量‘、互斥 锁)对其加以保护
可重入函数:可能被多个任务并发调用的函数
共享变量:全局变量和static变量
4.设置高扇入,合理扇出的函数
扇出:一个函数调用其它函数的数目
扇入:一个函数被调用的上级函数数目
扇出过大过小都不合理(最好3-5)。过大 表明函数过分复杂,需要过多调用下级函数。 过小 表明函数的调用层次可能过多,不利于结构分析。
扇入越大 表明此函数被调用的次数越多,这样的函数使用效率高,但不能一昧追求。
5.函数的不变参数使用const
6.在源文件范围内声明和定义的所有函数,除非外部可见,否则应该增加static关键字
标识符命名与定义
1.标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩 写,避免使人产生误解。
2 尽量避免名字中出现数字编号,除非逻辑上的确需要编号
3.全局变量应增加“g_” 前缀,静态变量应增加“s_”
使用全局变量十分危险,需要特殊标识,并提醒减少全局变量的使用
4.驼峰式命名法(目前主流)
该命名规范,要求第一个单词首字母小写,后面其他单词首字母大写,简单粗暴易学易 用。
5.对于数值或者字符串等等常量的定义,建议采用全大写字母,单词之间加下划线“_”的方式 命名(枚举同样建议使用此方式定义)
变量
1.要定义结构单一的结构体,不要设计面面俱到的数据结构
结构体的应该是相关的一组信息的集合,此结构体应该可以明确表达出一个对象。
2.防止局部变量与全局变量同名。
虽然 同名局部变量会屏蔽 全局变量。但还是不建议使用,其会使人误解
3.使用面向接口编程思想,通过API访问数据:如果本模块的数据需要对外部模块开放 ,应 提供接口函数来设置、获取,同时注意全局数据的访问互斥
宏,常量
1.使用宏时,不允许参数发生变化。
2.除非必要,应尽可能使用函数代替宏
表达式
1.函数调用不要作为另一个函数的参数使用,否则对于代码的调试、阅读都不利
即:不要将函数直接当 参数使用,需将其赋值
2.用括号明确表达式的操作顺序,避免过分依赖默认优先级
注释
1.注释的内容要清楚、明了,含义准确,防止注释二义性
2.注释是 对代码不明确的地方进行解释 而不是重复描述代码
3.函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、 设计约束等
排版与格式
1.多个短语句(包括赋值语句)不允许写在同一行内 ,即一行只写一条语句
2.在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格 ; 进行非对等操作时,如果是关系密切的立即操作符(如-> > ),后不应加空格