华为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
修饰输入参数能明确数据流向,避免意外修改数据,提升代码安全性。
