嵌入式C语言编程规范最佳实践1. 编程规范概述1.1 规范的重要性规范的编程风格不仅提升代码可读性还能显著提高团队协作效率。统一的代码风格使维护工作更加顺畅减少因风格差异导致的错误理解。1.2 核心原则编写代码时最重要的规则是保持与周围代码风格一致。当修改现有代码时即使其风格不符合个人偏好也应维持原有风格。2. 基础编码规范2.1 语言标准与缩进使用C99标准进行开发每个缩进级别使用4个空格禁止使用制表符关键字后加空格函数名后不加空格int32_t a sum(4, 3); /* 正确 */ int32_t a sum (4, 3); /* 错误 */2.2 命名约定变量、函数、宏、类型名不使用_前缀保留给C语言本身模块私有函数使用prv_name前缀包含下划线的名称只使用小写字母2.3 花括号与空格左花括号与关键字同行比较和赋值操作符前后使用单空格逗号后使用单空格for(i 0; i 5; i) { /* 正确 */ /* ... */ } a 3 4; /* 正确 */ a34; /* 错误 */ func_name(5, 4); /* 正确 */3. 变量声明规范3.1 变量初始化不显式初始化静态和全局变量为0或NULL同一类型变量在同一行声明static int32_t a; /* 正确 */ static int32_t b 4; /* 正确 */ static int32_t a 0; /* 错误 */ void my_func(void) { char a, b; /* 正确 */ }3.2 声明顺序自定义结构和枚举整数类型更宽的无符号类型优先单/双精度浮点int my_func(void) { my_struct_t my; /* 自定义结构 */ uint32_t a; int32_t b; double d; float f; }3.3 类型选择使用stdint.h中的标准类型如uint8_t不使用stdbool.h用1/0表示真/假使用size_t作为长度或大小变量4. 函数设计规范4.1 函数声明返回指针时星号对齐返回类型不修改指针内容时使用constconst char* my_func(void); /* 正确 */ my_struct_t* my_func(int32_t a); /* 正确 */ const char *my_func(void); /* 错误 */4.2 函数实现返回类型单独一行通用指针使用void*而非uint8_t*int32_t foo(void) { return 0; } void send_data(const void* data, size_t len) { const uint8_t* d data; /* ... */ }5. 复合语句与循环5.1 语句块即使单条语句也使用花括号else与if的右括号同行if(a) { /* 正确 */ do_a(); } else if(b) { do_b(); } else { do_c(); }5.2 循环控制空循环使用{}而非;优先使用前增量/减量while(is_register_bit_set()) {} /* 正确 */ for(size_t i 0; i 10; i) {} /* 正确 */6. 结构体与枚举6.1 类型定义结构体/枚举名小写带下划线枚举成员全大写使用doxygen文档语法typedef struct point { int32_t x; /*! X坐标 */ int32_t y; /*! Y坐标 */ } point_t; typedef enum { COLOR_RED, /*! 红色 */ COLOR_GREEN, /*! 绿色 */ } color_t;6.2 初始化使用C99风格初始化point_t p { .x 3, .y 4, };7. 宏定义规范7.1 基本规则宏名全大写带下划线参数和整体表达式用括号保护#define MIN(x, y) ((x) (y) ? (x) : (y)) #define SUM(x, y) ((x) (y))7.2 多语句宏使用do-while(0)保护多语句宏#define SET_POINT(p, x, y) do { \ (p)-px (x); \ (p)-py (y); \ } while(0)8. 文件组织规范8.1 头文件保护头文件必须包含保护宏和C检查#ifndef MODULE_H #define MODULE_H #ifdef __cplusplus extern C { #endif /* 内容... */ #ifdef __cplusplus } #endif #endif /* MODULE_H */8.2 文档注释每个文件包含doxygen文档和许可证/** * file module.h * brief 模块头文件 */ /* * 版权声明... */9. 注释规范9.1 注释风格使用/* */而非//多行注释每行使用空格星号关键代码使用12*4空格偏移量注释void my_func(void) { char a; a call_func(); /* 12*4空格偏移的注释 */ }9.2 Doxygen文档函数文档包含参数和返回值说明/** * brief 计算两数之和 * param[in] a: 第一个数 * param[in] b: 第二个数 * return 输入值之和 */ int32_t sum(int32_t a, int32_t b) { return a b; }
嵌入式C语言编程规范与最佳实践
发布时间:2026/5/22 12:31:53
嵌入式C语言编程规范最佳实践1. 编程规范概述1.1 规范的重要性规范的编程风格不仅提升代码可读性还能显著提高团队协作效率。统一的代码风格使维护工作更加顺畅减少因风格差异导致的错误理解。1.2 核心原则编写代码时最重要的规则是保持与周围代码风格一致。当修改现有代码时即使其风格不符合个人偏好也应维持原有风格。2. 基础编码规范2.1 语言标准与缩进使用C99标准进行开发每个缩进级别使用4个空格禁止使用制表符关键字后加空格函数名后不加空格int32_t a sum(4, 3); /* 正确 */ int32_t a sum (4, 3); /* 错误 */2.2 命名约定变量、函数、宏、类型名不使用_前缀保留给C语言本身模块私有函数使用prv_name前缀包含下划线的名称只使用小写字母2.3 花括号与空格左花括号与关键字同行比较和赋值操作符前后使用单空格逗号后使用单空格for(i 0; i 5; i) { /* 正确 */ /* ... */ } a 3 4; /* 正确 */ a34; /* 错误 */ func_name(5, 4); /* 正确 */3. 变量声明规范3.1 变量初始化不显式初始化静态和全局变量为0或NULL同一类型变量在同一行声明static int32_t a; /* 正确 */ static int32_t b 4; /* 正确 */ static int32_t a 0; /* 错误 */ void my_func(void) { char a, b; /* 正确 */ }3.2 声明顺序自定义结构和枚举整数类型更宽的无符号类型优先单/双精度浮点int my_func(void) { my_struct_t my; /* 自定义结构 */ uint32_t a; int32_t b; double d; float f; }3.3 类型选择使用stdint.h中的标准类型如uint8_t不使用stdbool.h用1/0表示真/假使用size_t作为长度或大小变量4. 函数设计规范4.1 函数声明返回指针时星号对齐返回类型不修改指针内容时使用constconst char* my_func(void); /* 正确 */ my_struct_t* my_func(int32_t a); /* 正确 */ const char *my_func(void); /* 错误 */4.2 函数实现返回类型单独一行通用指针使用void*而非uint8_t*int32_t foo(void) { return 0; } void send_data(const void* data, size_t len) { const uint8_t* d data; /* ... */ }5. 复合语句与循环5.1 语句块即使单条语句也使用花括号else与if的右括号同行if(a) { /* 正确 */ do_a(); } else if(b) { do_b(); } else { do_c(); }5.2 循环控制空循环使用{}而非;优先使用前增量/减量while(is_register_bit_set()) {} /* 正确 */ for(size_t i 0; i 10; i) {} /* 正确 */6. 结构体与枚举6.1 类型定义结构体/枚举名小写带下划线枚举成员全大写使用doxygen文档语法typedef struct point { int32_t x; /*! X坐标 */ int32_t y; /*! Y坐标 */ } point_t; typedef enum { COLOR_RED, /*! 红色 */ COLOR_GREEN, /*! 绿色 */ } color_t;6.2 初始化使用C99风格初始化point_t p { .x 3, .y 4, };7. 宏定义规范7.1 基本规则宏名全大写带下划线参数和整体表达式用括号保护#define MIN(x, y) ((x) (y) ? (x) : (y)) #define SUM(x, y) ((x) (y))7.2 多语句宏使用do-while(0)保护多语句宏#define SET_POINT(p, x, y) do { \ (p)-px (x); \ (p)-py (y); \ } while(0)8. 文件组织规范8.1 头文件保护头文件必须包含保护宏和C检查#ifndef MODULE_H #define MODULE_H #ifdef __cplusplus extern C { #endif /* 内容... */ #ifdef __cplusplus } #endif #endif /* MODULE_H */8.2 文档注释每个文件包含doxygen文档和许可证/** * file module.h * brief 模块头文件 */ /* * 版权声明... */9. 注释规范9.1 注释风格使用/* */而非//多行注释每行使用空格星号关键代码使用12*4空格偏移量注释void my_func(void) { char a; a call_func(); /* 12*4空格偏移的注释 */ }9.2 Doxygen文档函数文档包含参数和返回值说明/** * brief 计算两数之和 * param[in] a: 第一个数 * param[in] b: 第二个数 * return 输入值之和 */ int32_t sum(int32_t a, int32_t b) { return a b; }