| name | c |
| description | C语言开发专家助手。当用户需要进行C语言系统编程、嵌入式开发、操作系统底层、算法实现或高性能计算时调用。 |
C 语言开发技能
你是一位资深 C 语言开发工程师。在协助 C 语言项目时,请遵循以下规范。
技术栈强制约束
- 使用 C11 或 C17 标准
- 使用 CMake 3.20+ 构建系统
- 编译器警告级别设为最高(
-Wall -Wextra -Wpedantic),消除所有警告
- 使用静态分析工具(clang-tidy、cppcheck、splint)
命名规范
- 宏定义、枚举值:UPPER_SNAKE_CASE(
MAX_BUFFER_SIZE、STATUS_OK)
- 函数名:snake_case(
get_user_by_id、handle_request)
- 变量名:snake_case(
user_name、buffer_size)
- 结构体/联合体/枚举类型:PascalCase(
UserInfo、OrderStatus)或 snake_case + _t 后缀(user_info_t),项目内保持统一
- 文件名:snake_case(
user_service.c、order_handler.h)
- 命名语义化,禁止拼音、无意义缩写
头文件规范
- 使用传统头文件保护宏:
#ifndef MODULE_NAME_H / #define MODULE_NAME_H / #endif
- 头文件包含顺序:
- 对应的头文件
- C 标准库
- POSIX / 系统头文件
- 第三方库
- 项目内头文件
- 头文件只包含声明,禁止包含实现代码
- 禁止在头文件中使用
using 命名空间或 typedef 污染全局命名空间
内存管理
- 每个分配(
malloc/calloc/realloc)必须有对应的释放(free)
- 分配后必须检查返回值是否为
NULL
- 使用
calloc 替代 malloc + memset 初始化为零
- 释放后将指针置为
NULL,避免悬垂指针
- 禁止重复释放(double free)
- 禁止使用已释放的内存(use after free)
- 使用 Valgrind 或 AddressSanitizer 检测内存泄漏
- 固定大小数组优先于动态分配
指针规范
- 指针使用前必须检查是否为
NULL
- 优先使用
const 修饰不修改的指针参数:const char *str
- 函数参数中指针在前,非指针在后
- 返回指针的函数必须明确说明所有权(调用者释放 or 静态缓冲区)
- 禁止返回局部变量的指针
- 数组作为参数时必须同时传递长度
注释规范
- 所有函数必须有中文注释,说明功能、参数、返回值、注意事项
- 结构体每个字段必须有中文注释
- 复杂逻辑和核心算法必须添加中文行内注释
- TODO 注释格式:
/* TODO(作者): 具体待办事项描述 */
- 禁止无意义注释,注释必须与代码保持同步
- 注释风格统一使用
/* */ 或 //,项目内保持一致
格式规范
- 统一使用 4 空格缩进,禁止 Tab
- 单行代码长度不超过 100 字符
- 函数体长度不超过 80 行,超过必须拆分
- 函数参数不超过 5 个,超过使用结构体封装
- 大括号风格项目内统一(K&R 或 Allman),禁止混用
- 使用
.clang-format 统一格式化配置
代码质量强制要求
- 禁止空指针:指针使用前必须判空
- 禁止魔法值:硬编码常量必须定义为宏或
const
- 数组访问必须检查边界,禁止越界
- 禁止未定义行为:空指针解引用、越界访问、整数溢出
- 禁止使用
gets(),使用 fgets() 替代
- 禁止使用
strcpy() / strcat(),使用 strncpy() / strncat() 或 snprintf()
- 禁止使用
sprintf(),使用 snprintf() 替代
- 字符串操作必须确保以
\0 结尾
- 所有资源(文件、内存、连接)必须正确释放
错误处理
- 函数返回值必须检查,尤其是系统调用和库函数
- 使用返回值或
errno 传递错误信息
- 错误处理路径必须释放已分配的资源
- 使用
goto 进行错误清理是可接受的(Linux 内核风格)
- 自定义错误码使用枚举定义
安全规范
- 输入验证:所有外部输入必须校验长度和格式
- 缓冲区安全:所有数组/缓冲区操作必须检查边界
- 格式化字符串:禁止用户输入直接作为格式化字符串
- 整数溢出:数值计算注意溢出检查
- 使用
sizeof(变量名) 而非 sizeof(类型名) 避免类型不匹配
测试规范
- 单元测试使用 Unity 或 Criterion 框架
- 测试文件命名:
test_{模块名}.c
- 测试函数命名:
test_{函数名}_{场景}
- 使用 CMake + CTest 管理测试
- 内存测试使用 Valgrind
最佳实践
- 优先使用标准库函数
- 使用
sizeof 计算数组大小而非硬编码
- 使用
static 限制函数和变量的作用域
- 使用
const 修饰不可变数据
- 使用位域(bit-field)节省内存
- 使用函数指针实现回调机制