同步操作将从 Huawei LiteOS/LiteOS 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
此编程规范在业界通用的编程规范基础上进行了整理,供开发者参考使用。
建议将工程按照功能模块划分子目录(可参考LiteOS的功能模块划分),子目录再定义头文件和源文件目录。
类型 | 命名风格 | 形式 |
---|---|---|
函数,自定义的类型 | 大驼峰,或带有模块前缀的大驼峰 | AaaBbb, XXX_AaaBbb |
局部变量,函数参数,宏参数,结构体成员,联合体成员 | 小驼峰 | aaaBbb |
全局变量 | 带'g_'前缀的小驼峰 | g_aaaBbb |
宏,枚举值 | 全大写并下划线分割 | AAA_BBB |
内核头文件中防止重复包含的宏变量 | 带'_LOS'前缀和'H'后缀,中间为大写模块名,以下划线分割 | _LOS_MODULE_H |
LOS_TaskCreate
LOS_SwtmrStart
LOS_SemPend
OsTaskScan
OsSwtmrStart
struct MyType { // 左大括号跟随语句放行末,前置1个空格
...
}; // 右大括号后面紧跟分号
int Foo(int a)
{ // 函数左大括号独占一行,放行首
if (a > 0) { // 左大括号跟随语句放行末,前置1个空格
...
} else { // 右大括号、"else"、以及后续的左大括号均在同一行
...
} // 右大括号独占一行
...
}
if (objectIsNotExist) { // 单行条件语句也加大括号
return CreateNewObject();
}
while (condition) {} // 即使循环体是空,也应使用大括号
while (condition) {
continue; // continue表示空逻辑,使用大括号
}
switch (var) {
case 0: // 缩进一层
DoSomething1(); // 缩进一层
break;
case 1:
DoSomething2();
break;
default:
break;
}
// 假设下面第一行不满足行宽要求
if (currentValue > MIN && // 换行后,布尔操作符放在行末
currentValue < MAX) { // 与(&&)操作符的两个操作数同类对齐
DoSomething();
...
}
// 假设下面的函数调用不满足行宽要求,需要换行
ReturnType result = FunctionName(paramName1,
paramName2,
paramName3); // 保持与上方参数对齐
ReturnType result = VeryVeryVeryLongFunctionName( // 写入第1个参数后导致过长,直接换行
paramName1, paramName2, paramName3); // 换行后,4空格缩进一层
// 每行的参数代表一组相关性较强的数据结构,放在一行便于理解,此时可理解性优先于格式排版要求
int result = DealWithStructLikeParams(left.x, left.y, // 表示一组相关参数
right.x, right.y); // 表示另外一组相关参数
int *p1; // Good:右跟随变量,和左边的类型隔了1个空格
int* p2; // Bad:左跟随类型
int*p3; // Bad:两边都没空格
int * p4; // Bad:两边都有空格
char * const VERSION = "V100"; // Good:当有const修饰符时,"*"两边都有空格
int Foo(const char * restrict p); // Good:当有restrict修饰符时,"*"两边都有空格
#if defined(__x86_64__) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16) // 位于行首,不缩进
#define ATOMIC_X86_HAS_CMPXCHG16B 1 // 缩进一层,区分层次,便于阅读
#else
#define ATOMIC_X86_HAS_CMPXCHG16B 0
#endif
注释的内容要清楚、明了,含义准确,防止注释二义性。
在代码的功能、意图层次上进行注释,即注释解释代码难以直接表达的意图,而不是仅仅重复描述代码。
函数声明处注释描述函数功能、性能及用法,包括输入和输出参数、函数返回值、可重入的要求等;定义处详细描述函数功能和实现要点,如实现的简要步骤、实现的理由、设计约束等。
全局变量要有较详细的注释,包括对其功能、取值范围以及存取时注意事项等的说明。
避免在注释中使用缩写,除非是业界通用或子系统内标准化的缩写。
文件头部要进行注释,建议注释列出:版权说明、版本号、生成日期、作者姓名、功能说明、与其它文件的关系、修改日志等。
注释风格要统一,建议优先选择/* */的方式,注释符与注释内容之间要有1空格,单行、多行注释风格如下:
/* 单行注释 */
/*
* 多行注释
* 第二行
*/
注释应放在其代码上方或右方。
上方的注释,与代码行之间无空行,保持与代码一样的缩进。 右边的注释,与代码之间至少相隔1个空格。如果有多条右置注释,上下对齐会更加美观,比如:
#define A_CONST 100 // 此处两行注释属于同类
#define ANOTHER_CONST 200 // 可保持左侧对齐
#ifdef LOSCFG_XXX
...
#endif
#define SUM(a, b) a + b // 不符合本条要求
#define SUM(a, b) ((a) + (b)) // 符合本条要求
#define SOME_CONST 100 // 单独的数字无需括号
#define ANOTHER_CONST (-1) // 负数需要使用括号
#define THE_CONST SOME_CONST // 单独的标识符无需括号
#define FOO(x) do { \
(void)printf("arg is %d\n", (x)); \
DoSomething((x)); \
} while (0)
#ifndef _LOS_<MODULE>_H // 比如 _LOS_TASK_H
#define _LOS_<MODULE>_H
...
#endif
基础类型定义统一使用los_typedef.h中定义的类型,比如定义无符号32位整型变量使用UINT32。
int *Func(void)
{
int localVar = 0;
...
return &localVar; // 错误
}
void Caller(void)
{
int *p = Func();
...
int x = *p; // 程序产生未定义行为
}
int Func(void)
{
int localVar = 0;
...
return localVar;
}
void Caller(void)
{
int x = Func();
...
}
// 私有头文件中引入全局变量,但要避免直接使用
extern LosMuxCB *g_allMux;
// 通过GET_MUX的方式对g_allMux进行访问
#define GET_MUX(muxID) (((LosMuxCB *)g_allMux) + GET_MUX_INDEX(muxID))
不使用与硬件或操作系统关系很大的语句,而使用建议的标准语句,以提高软件的可移植性和可重用性。
C语言编程规范参考资料较多,大家可以自行了解,本文不再过多赘述。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。