C/C++ 代码规范与文档规范(完整版)
本规范适用于项目内所有 C/C++ 代码,旨在统一风格、提升可读性与可维护性。建议配合 clang-format、Doxygen 等工具落地。
一、代码规范
1.1 命名规范
📌 优先级原则:本地可读性 > 跨平台一致性。下划线风格在 Linux 生态更常见,小驼峰在 Windows 较多,选定后使用 clang-format 保证统一。
1.2 注释规范
文件头注释(每个 .h/.cpp 必备)
类注释(放在类定义前)
1 2 3 4 5
|
class ConfigParser { ... };
|
复杂函数注释(参数、返回值、异常)
1 2 3 4 5 6 7 8
|
bool parseFile(const std::string& file_path, int mode);
|
行内注释(仅必要处)
- 解释“为什么这么做”,而非“做了什么”。
- 复杂算法、边界条件必须注释。
使用 .clang-format 配置文件(推荐 Google 风格,根据项目微调):
1 2 3 4 5
| BasedOnStyle: Google IndentWidth: 2 ColumnLimit: 80 AllowShortFunctionsOnASingleLine: Inline BreakBeforeBraces: Attach
|
统一要求:
- 缩进:2 或 4 空格(禁止 Tab)
- 行宽:≤ 80 或 ≤ 120(团队约定)
- 大括号:K&R 风格(左括号不换行)
- 指针/引用
* / & 紧跟类型:int* ptr;
#include 顺序:当前类头、C库、C++库、第三方库、项目内头文件(每类按字母排序)
1.4 头文件与源文件职责划分
1 2 3 4 5
| 遇到一段代码,问自己: │ ├── 这是"声明/描述/公告"吗? ──→ 放 .h │ └── 这是"实现/定义/干活"吗? ──→ 放 .c
|
具体判断流程
1 2 3 4 5 6 7 8 9 10 11 12 13
| 是 struct/enum/typedef 吗? └── 是 → 放 .h
是函数吗? ├── 只有声明(带分号,无花括号)→ 放 .h └── 有实现(有花括号) → 放 .c
是变量吗? ├── 带 extern(只声明,不分配内存)→ 放 .h └── 不带 extern(分配内存) → 放 .c(且只放一处)
是 static 吗? └── 只在本文件用 → 放 .c
|
常见错误
二、文档规范
2.1 项目级文档:README.md(必须)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # 项目名称
一句话简介。
## 目录结构 简要说明核心目录。
## 编译与运行 ### 依赖 - CMake ≥ 3.10 - OpenSSL …
### 构建步骤 ```bash mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j4
|
运行示例
架构图
(Mermaid 或 ASCII 图)
graph TD
A[主控] --> B[解析器]
B --> C[存储器]
核心模块说明
- 模块A:功能简述,详见
docs/module_a.md
- 模块B:…
测试
常见问题(FAQ)
2.2 核心模块文档
两种方式任选或并存:
方式一:独立 Markdown(推荐大型模块)
- 位置:
docs/ 目录下,文件名与模块名对应,如 config_parser.md
- 内容:模块概述、设计思路、接口说明、使用示例、依赖关系图
方式二:Doxygen 生成
- 在头文件中按 1.2 注释规范写好 Doxygen 格式注释
- 项目根目录提供
Doxyfile(可用 doxygen -g 生成)
- 启用:
EXTRACT_ALL = YES, JAVADOC_AUTOBRIEF = YES
- 输出:HTML 或 PDF,放在
docs/html/
📌 推荐二者结合:README 总览 + Doxygen 生成 API 文档 + 核心模块单独写架构设计.md。
三、工具链集成建议
四、文件与目录组织(推荐)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| project/ ├── .clang-format ├── .clang-tidy ├── CMakeLists.txt ├── README.md ├── CONTRIBUTING.md ├── src/ # 源代码 │ ├── module_a/ │ │ ├── parser.cpp │ │ └── parser.h │ └── main.cpp ├── include/ # 公开头文件 │ └── project/... ├── docs/ # 文档 │ ├── api/ # Doxygen 输出 │ ├── architecture.md │ └── module_details.md ├── tests/ # 单元测试 │ └── parser_test.cpp └── examples/ # 示例代码 └── demo.cpp
|
五、示例汇总(快速参考)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
#ifndef MATH_UTILS_H #define MATH_UTILS_H
int gcd(int a, int b);
#endif
|
对应的 math_utils.cpp 需包含相同注释(简要版)或仅实现。
本规范即日起生效,所有新增代码必须遵循,存量代码逐步迁移。
如有争议,以 clang-format 自动格式化的结果为准。