自动化与电气工程学院自动化与电气工程学院 嵌入式嵌入式 C 语言编程规范语言编程规范 日期日期 2013 12 31 版本版本 V2 4 整理整理 王晓荣王晓荣 一 一 规范说明规范说明 本规范作为南京工业大学自动化与电气工程学院教师 学生从事嵌入式 C 语言等相关开发 工作的编程规范 带有索引性质 力求简洁明了 请遵照此规范进行嵌入式 C 语言编程教学和 学习 二 二 命名规则命名规则 通用命名规则通用命名规则 1 移植代码和修改部分代码时 保持原命名风格 2 目录名 目录名 文件名 函数名 文件名 函数名 参数名 参数名 变量名变量名等 如果无特殊的需求 如果是引用其他地方 可以保留相应的名称 均采用 Uinx 风格 全小写全小写 下划线下划线 特别注明除外 说明 不同系统对文件名大小写处理不同 MS 的 DOS Windows 不区分大小写 但是 Linux 系统则区分 所以代码文件命名建议统一采用全小写字母命名 示例 3 禁止使用单字节单字节命名变量 但允许定义 i j k 作为局部循环变量 4 除了常见的通用缩写通用缩写 附录 A 以外 不使用单词缩写 不得使用汉语拼音 5 用正确的反义词组反义词组 附录 B 命名具有互斥意义的变量或相反动作的函数等 变量名变量名 6 全局变量全局变量和全局全局静态静态变量变量添加前缀 说明 全局变量十分危险 全局变量十分危险 能不用则不用能不用则不用 不得不用时 通过前缀使得全局变量更加醒目 促使使用时更加小心 单个文件内部使用全局变量 应加 static 关键字进行封装 变成全局静态变量 示例 变量类型变量类型 7 基本变量类型基本变量类型用 typedef 按以下形式定义 移植或修改的文件 保持原风格 8 非基本变量类型 如结构 指针 枚举 共同体结构 指针 枚举 共同体不得使用 typedef 形式定义 移植或修改 的文件 保持原风格 规范的使用方法如下示例 说明 使用 typedef 会隐藏这个变量实际上是什么类型 在传递参数会增加出错概率 示例 结构体声明与定义 枚举类型声明与定义 宏 枚举成员命名宏 枚举成员命名 9 宏 枚举成员宏 枚举成员采用 全大写全大写 下划线下划线 形式 示例 注 除了头文件或编译开关等特殊标识定义 宏定义不能使用下划线 开头和结尾 三 三 程序格式程序格式 10 程序块采用缩进风格编写 每级缩进为 4 个空格个空格 说明 将编辑器的 TAB键设置为自动转 4 个空格输入 这样可以防止程序在别的编辑器内打 开时原先的格式排版失效 若干软件相关设置见附录 C 11 每个 符号后都应缩进 唯一例外是 switch case 语句中 case 和 default 应与 对齐 示例 注 switch 语句必须有 default 分支 12 相对独立的程序块之间 变量说明之后必须加空行 示例 不规范格式 规范格式 13 每行语句 80 个字符个字符要拆分换行 注释除外 说明 换行时要增加一级缩进 使代码可读性更好 低优先级操作符处划分新行 换行时操作符应该也放下来 放在新行首 换行时建议一个完整的语句放在一行 不要根据字符数断行 示例 14 二元操作符二元操作符 如 赋值操作符 比较操作符 算术操作符 逻辑操作符 位域操作符 如 等的前后前后都都加空格加空格 15 一元操作符一元操作符 如 地址操作符 以及关系密切的 立即操作符立即操作符 如 等前前后后都都不加空格不加空格 16 逗号 分号只在后面加空格后面加空格 17 指针与引用符号 在变量定义的时候靠右靠右 在函数返回值时靠左靠左 示例 18 多个短语句 包括赋值语句 不允许写在同一行内 即一行只写一条语句 示例 不好的排版 较好的排版 19 if for do while case switch default 等语句自占一行 且 if for do while 等语句 的执行语句部分无论多少都要加括号 当 while 作为循环等待语句时除外 示例 20 如果代码行中的运算符比较多 用括号确定表达式的操作顺序 避免使用默认的优先级 示例 21 尽量避免含有否定运算否定运算的条件表达式 示例 四 四 注释注释 22 注释中英文皆可 注释必须简洁准确 注释的位置应该与被描述的代码相邻 可以放在代 码的上方上方或右方右方 不可放在下方 23 注释全部按照 doxygen 风格风格 示例 文件头部注释 函数头部注释 语句上方注释 语句右方注释 24 修改别人大段代码时 不要轻易不要轻易删除别人的代码 应该用 注释 并注明修改人及日期 示例 五 五 头文件头文件 25 禁止在头文件中定义变量 说明 在头文件中定义变量 将会由于头文件被其他 c 文件包含而导致变量重复定义 26 只能通过包含头文件的方式使用其他 c 提供的接口 禁止在 c 中通过 extern 的方式使用 外部函数接口 变量 说明 若 a c 使用了 b c 定义的 func 函数 则应当在 b h 中声明 int func int input 并在 a c 中通过 include b h 来使用 func 禁止通过在 a c 中直接写 extern int func int input 来使用 func 这种写法容易在 func 改变时可能导致声明和定义不一致 27 头文件中需添加避免重复定义的代码 说明 头文件名和后缀全部大写 两者之间的 用 一个下划线一个下划线 替代 左 侧采用 两个下划线两个下划线 以避免重名 另外也可以根据文件名中是否包含多个词语而采用 连接起来 示例 28 头文件是模块 Module 或单元 Unit 的对外接口 头文件中应放置对外提供的函数 声明 宏定义 类型定义等 说明 内部使用的函数 相当于类的私有方法 声明不应放在头文件中 内部使用的宏 枚举 结构定义不应放入头文件中 六六 函数函数 29 一个函数仅完成一项一项功能功能 30 代码重复超过三次三次时 应该尽可能提炼成函数 消除重复 31 函数有效代码 非空非注释行 不超过 50 行行 移植或修改代码保持原风格 说明 过长的函数往往意味着函数功能不单一 过于复杂 参考 29 条规则 一个函数只 完成一个功能 32 在源文件范围内声明和定义的所有函数 除非外部可见除非外部可见 否则应该增加 static 关键字 33 如果函数入口参数入口参数为空 必须使用 void 作为入口参数 如果函数没有返回值返回值 那么应 声明为 void 类型 34 仅作输入参数使用的指针指针 应在类型前加 const 防止该指针在函数体内被意外修改 说明 目的参数放在前面 源参数放在后面 示例 七七 附录 附录 附录附录 A 全称全称 缩写缩写 全称全称 缩写缩写 address addr list lst administrator adm mailbox mbox application app manage manager mgr man argument arg maximum max assemble asm memory mem asynchronization asyn message msg average avg minimum min back bk multiplex mux buffer buf object obj button btn operating system os calculate calc origin original org character char overflow ovf change chg parameter param check chk password psw clear clr picture pic clock clk pointer ptr column col point pnt pt command cmd position pos compare cmp previous pre prev configuration cfg program prg context ctx print prn control ctrl priority prio copy cpy process procedure proc count cnt properties prop current cur read rd decrease dec receive rcv delay dly ready rdy delete del reference ref destination dest dst register reg device dev register reg dictionary dict request req different diff resource res directory dir return ret disable dis schedule sched document doc second sec driver drv segment seg display disp select sel dynamic dyna source src enable en semaphore sem end of text etx server svr environment env stack stk error err standard std execute exec start of text stx extend ex ext storage stg function func fn string str flag flg summation sum group grp system sys hexadecimal hex synchronize sync i o system ios temporary temp tmp image img translate transation transparent tran trans increase inc test tst index idx text txt information info timer tmr initial initialize initialization init transmit trs insert ins trigger trig length len variable var library lib version ver link lnk write wr 附录附录 B add remove begin end create destroy insert delete first last get release increment decrement put get add delete lock unlock min max open close old new start stop next previous source target show hide send receive source destination copy paste up down 附录附录 C MDK 软件 做如下设置 Source Insight 中 做如下设置 Vim 中 做如下设置 向 Vim 配置文件中添加下列语句
展开阅读全文