C代码规范

1、文件与目录

  1. 文件及目录的命名规定可用的字符集是[A-Z;a-z;0-9;._-]。

  2. 源文件名后缀用小写字母 .c 和.h。

  3. 文件的命名要准确清晰地表达其内容,同时文件名应该精练,防止文件名过长而造成使用不便。在文件名中可以适当地使用缩写。

    以下提供两种命名方式以供参考:

    • 各程序模块的文件命名开头 2 个消协字母代表本模块的功能:
      • 如:主控程序为 mpMain.c,mpDisp.c …
    • 不写模块功能标识:
      • 如:主控程序为 Main.c,Disp.c …
  4. 一个软件包或一个逻辑组件的所有头文件和源文件建议放在一个单独的目录下,这样有利于查找并使用相关的文件,有利于简化一些编译工具的设置。

  5. 对于整个项目需要的公共头文件,应存放在一个单独的目录下(例如:myProject/include)下,可避免其他编写人引用时目录太过分散的问题。

  6. 对于源码文件中的段落安排,我们建议按如下的顺序排列:

    a. 文件头注释

    b. 防止重复引用头文件的设置

    c. #include 部分

    d. #define 部分

    e. enum 常量声明

    f. 类型声明和定义,包括 struct、union、typedef 等

    g. 全局变量声明

    h. 文件级变量声明

    i. 全局或文件级函数声明

    j. 函数实现。按函数声明的顺序排列

    k. 文件尾注释

  7. 在引用头文件时,不要使用绝对路径。如果使用绝对路径,当需要移动目录时,必须修改所有相关代码,繁琐且不安全;使用相对路径,当需要移动目录时,只需修改编译器的某个选项即可。

    1
    2
    1. #include “/project/inc/hello.h” /* 不应使用绝对路径 */
    2. #include “../inc/hello.h” /* 可以使用相对路径 */
  8. 在引用头文件时,使用 <> 来引用预定义或者特定目录的头文件,使用 “” 来引用当前目录或者路径相对于当前目录的头文件。

    1
    2
    3
    4
    1. #include <stdio.h> /* 标准头文件 */
    2. #include <projdefs.h> /* 工程指定目录头文件 */
    3. #include “global.h” /* 当前目录头文件 */
    4. #include “inc/config.h” /* 路径相对于当前目录的头文件 */
  9. 为了防止头文件被重复引用,应当用 ifndef/define/endif 结构产生预处理块。

    1
    2
    3
    4
    5
    1. #ifndef __DISP_H /* 文件名前名加两个下划线“__”,后面加 “_H”
    2. #define __DISP_H
    3. ...
    4. ...
    5. #endif
  10. 头文件中只存放“声明”而不存放“定义”,通过这种方式可以避免重复定义。

    1
    2
    1. /* 模块 1 头文件: module1.h */
    2. extern int a = 5; /* 在模块 1 的 .h 文件中声明变量 */
    1
    2
    1. /* 模块 1 实现文件:module1.c */
    2. uint8_t g_ucPara; /* 在模块 1 的 .h 文件中定义全局变量 g_ucPara */
  11. 如果其它模块需要引用全局变量 g_ucPara, 只需要在文件开头包含 module1.h

    1
    2
    3
    4
    5
    1. /* 模块 2 实现文件:module2.c */
    2. #include “module1.h” /* 在模块 2 中包含模块 1 的 .h 文件 */
    3. ......
    4. g_ucPara = 0;
    5. ......
  12. 对于文件的长度没有非常严格的要求,但应尽量避免文件过长。一般来说,文件长度应尽量保持在 1000 行之内。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!