通用C语言编码规范
通用C语言编码规范
1. 总体原则
1.1 可读性优先
- 代码应该像散文一样易于阅读
- 清晰的命名比短小的命名更重要
- 一致性胜过个人偏好
1.2 简洁性
- 避免不必要的复杂性
- 一个函数只做一件事
- 避免过深的嵌套
1.3 安全性
- 检查所有输入参数
- 避免缓冲区溢出
- 明确处理错误情况
2. 命名约定
2.1 文件命名
1 | // 源文件使用小写字母和下划线 |
2.2 函数命名
2.2.1 公共函数 - snake_case
1 | // 公共API函数使用模块前缀 |
2.2.2 静态函数 - snake_case + 前缀
1 | // 静态(私有)函数使用下划线前缀或模块内前缀 |
2.3 变量命名
2.3.1 局部变量 - snake_case
1 | int buffer_size; |
2.3.2 全局变量 - g_ 前缀
1 | static int g_instance_count = 0; // 模块内全局变量 |
2.3.3 常量 - 大写字母
1 |
|
2.3.4 函数指针
1 | typedef int (*error_handler_t)(int error_code); |
2.4 类型命名
2.4.1 结构体 - _t 后缀
1 | typedef struct { |
2.4.2 枚举 - _e 后缀, 成员大写
1 | typedef enum { |
2.4.3 联合体 - _u 后缀
1 | typedef union { |
3. 代码格式化
3.1 缩进和空格
1 | // 使用4个空格缩进,不使用Tab |
3.2 大括号风格 - K&R风格
1 | // 函数大括号另起一行 |
3.3 空行和空格
1 | // 逻辑块之间加空行 |
3.4 行长度
- 每行最多80个字符
- 长行适当折断
1 | // 函数参数过长时的折行 |
4. 函数设计
4.1 函数长度
- 函数应该简短,通常不超过50行
- 一个函数只做一件事
4.2 参数传递
1 | // 输入参数使用const |
4.3 返回值约定
1 | // 错误码返回值 - 0表示成功,负值表示错误 |
5. 变量声明
5.1 声明位置
1 | // 在使用前就近声明 |
5.2 初始化
1 | // 变量声明时初始化 |
5.3 指针声明
1 | // *靠近变量名 |
6. 结构体和枚举
6.1 结构体设计
1 | // 结构体成员对齐考虑 |
6.2 枚举设计
1 | // 显式指定值 |
6.3 位域
1 | // 位域结构体 |
7. 宏定义
7.1 简单宏
1 |
7.2 函数式宏
1 | // 使用do-while(0)包装 |
7.3 条件编译
1 |
|
8. 注释规范
8.1 文件头注释
1 | /** |
8.2 函数注释
1 | /** |
8.3 行内注释
1 | int process_data(const uint8_t *data, size_t len) |
8.4 TODO和FIXME
1 | // TODO: 添加更多的错误检查 |
9. 文件组织
9.1 头文件结构
1 |
|
9.2 源文件结构
1 | /* 1. 文件头注释 */ |
10. 错误处理
10.1 错误码定义
1 | // 错误码枚举 |
10.2 参数检查
1 | int safe_function(const char *input, char *output, size_t output_size) |
10.3 错误传播
1 | int complex_operation(const char *file_path, data_t *result) |
11. 内存管理
11.1 动态内存分配
1 | // 安全的内存分配 |
11.2 缓冲区安全
1 | // 安全的字符串复制 |
12. 最佳实践总结
12.1 代码质量检查清单
- 所有函数都有参数检查
- 没有硬编码的魔法数字
- 所有分配的内存都被释放
- 没有悬空指针
- 缓冲区边界检查
- 错误码正确传播
- 函数名清晰表达意图
- 注释解释了”为什么”而不只是”做什么”
12.2 性能考虑
- 避免在循环中进行昂贵操作
- 合理使用const关键字
- 考虑内存对齐
- 最小化函数调用开销
12.3 可维护性
- 保持函数简短
- 避免深层嵌套
- 使用有意义的变量名
- 模块化设计
12.4 可移植性
- 避免依赖特定编译器扩展
- 使用标准C库函数
- 考虑字节序问题
- 使用配置宏处理平台差异
附录:常用工具
A.1 静态分析工具
cppcheck- 静态代码分析clang-tidy- 代码质量检查splint- 代码注释检查
A.2 格式化工具
clang-format- 自动代码格式化indent- GNU缩进工具
A.3 内存检查工具
valgrind- 内存泄漏检测AddressSanitizer- 地址检查static analysis- 静态内存分析
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 lbq开发日志!