华为c语言编程规范
华为C语言编程规范
排版规范
| 规则 | 说明 | 示例 |
|---|---|---|
| 缩进与空格 | 程序块缩进使用4个空格,独立程序块和变量声明后加空行。 | c int main() { // 代码逻辑 } |
| 行长限制 | 单行代码不超过80字符,长语句在低优先级操作符处分行,操作符置于新行开头。 | c result = (a + b) (c d); // 超长时换行 result = (a + b) (c d); |
| 流程控制语句 | if、for等语句必须用大括号包裹,即使单行也需执行。 |
c if (condition) { // 执行逻辑 } |
注释规范
| 规则 | 说明 | 示例 |
|---|---|---|
| 注释原则 | 注释应解释代码意图而非重复代码,避免在表达式中间插入注释。 | c // 计算平方和 sum = a² + b²; |
| 文件头注释 | 必须包含版权、作者、功能说明、修改日志等信息。 | c / File: example.c Auther: Zhang San Date: 2023-01-01 Description: 实现XXX功能 / |
| 函数注释 | 函数声明处描述功能、参数和返回值,定义处补充实现细节。 | c / @brief 计算两个数的和 @param a 第一个加数 @param b 第二个加数 @return 和 @retval int @constraint 无 / int add(int a, int b) { return a + b; } |
标识符命名规范
| 类别 | 规则 | 示例 |
|---|---|---|
| 通用规则 | 使用完整单词或广泛接受的缩写,避免拼音,禁止使用下划线开头(宏定义除外)。 | errorCode(正确),err_code(错误) |
| 变量命名 | 全局变量前缀g_,静态变量前缀s_,局部变量禁用单字符(循环变量i/j/k除外)。 |
g_config, s_state, index |
| 函数命名 | 动词或“动词+名词”结构,如InitModule()。 |
CalculateTotal(), GetUserInfo() |
| 宏定义 | 全大写字母,单词间下划线分隔,避免使用下划线包裹。 | MAX_BUFFER_SIZE, ENABLE_LOG |
变量与结构
| 规则 | 说明 | 示例 |
|---|---|---|
| 变量设计 | 一个变量仅用于单一功能,避免多重用途。 | c int count; // 仅用于计数 float temperature; // 仅存储温度值 |
| 全局变量 | 减少全局变量使用,若必须存在需提供访问接口并初始化。 | c int g_globalCount = 0; void SetGlobalCount(int value) { g_globalCount = value; } |
| 结构体设计 | 结构体功能单一,通信用结构体需注意字节序。 | c typedef struct { int id; char name[50]; } UserInfo; |
函数与过程
| 规则 | 说明 | 示例 |
|---|---|---|
| 函数长度 | 新增函数不超过50行(非空非注释),嵌套层次不超过4层。 | 将复杂逻辑拆分为ProcessData()和ValidateInput() |
| 参数与返回值 | 参数个数不超过5个,优先使用const修饰不变参数,返回值需全面处理错误码。 |
c int CopyBuffer(const char src, char dst, int len); |
| 可重入性 | 避免使用共享变量,必要时通过互斥锁或关中断保护。 | c int SafeIncrement(int counter) { locked(); (counter)++; unlock(); return counter; } |
宏与常量
| 规则 | 说明 | 示例 |
|---|---|---|
| 宏定义 | 用括号包裹表达式,多条语句用大括号包裹,避免副作用。 | c #define SQUARE(x) ((x) (x)) #define INIT_MODULE() do { // 初始化代码 } while(0) |
| 常量定义 | 推荐使用const或enum替代宏定义。 |
c const int MAX_RETRY = 3; enum { SUCCESS, FAILURE }; |
头文件规范
| 规则 | 说明 | 示例 |
|----------|----------|----------|| 仅放置对外接口声明(函数、宏、类型定义),禁止定义变量。 | module.h中声明void InitModule();,但不定义具体实现 |
| 包含顺序 | 从抽象到具体:C标准库→OS相关→第三方库→项目头文件。 | c #include <stdio.h> #include "os_api.h" #include "module.h" |
| 自包含要求 | 每个头文件必须能独立编译,使用#ifndef保护符。 | c #ifndef MODULE_H #define MODULE_H // 内容 #endif |

代码测试与维护
| 规则 | 说明 | 示例 |
|---|---|---|
| 测试要求 | 单元测试覆盖所有功能,集成测试验证模块交互。 | 为Add()函数编写边界值测试用例 |
| 废弃代码 | 及时删除未调用的函数和变量,避免冗余。 | 删除已替换的旧算法函数OldAlgorithm() |
| 代码审查 | 通过同行评审发现潜在问题,确保代码质量。 | 使用reviewtool工具检查代码风格一致性 |
相关问题与解答
问题1:为什么华为规范要求头文件职责单一且禁止循环依赖?
答:头文件职责单一可减少编译时间,避免因修改一个头文件导致大量源文件重新编译,禁止循环依赖(如a.h包含b.h,b.h又包含a.h)可防止编译错误和不可控的依赖链,提升代码维护性。

问题2:在华为规范中,为何强调函数参数不超过5个且需用const修饰?
答:参数过多会增加函数复杂度,降低可读性和可维护性,限制参数数量(≤5)可强制开发者简化接口设计,使用const修饰输入参数能明确数据流向,避免意外修改数据,提升代码安全性。

版权声明:本文由环云手机汇 - 聚焦全球新机与行业动态!发布,如需转载请注明出处。


冀ICP备2021017634号-5
冀公网安备13062802000102号