您的位置:首页 >要闻 >

阿里AliOS的编码风格,请收藏! 天天时快讯

2023-06-01 09:57:26    来源:面包芯语

关注+星标公众号,不错过精彩内容

来源 | 阿里官网


(相关资料图)

分享正文之前推荐一个嵌入式招聘信息的平台:

1. 前言

本文是AliOS Things提供的一套C语言代码规范,适用的对象为符合C99标准的C语言工程。

2. 命名

本节内容均为建议,不作强制要求。

2.1. 总则

各种命名均使用英文单词及其缩写,非特殊情况不能使用汉语拼音或其他语言。

2.2. 文件命名

文件名全部使用小写字母,用_连接。源文件使用.c后缀。头文件使用.h后缀。

2.3. 类型命名

2.3.1. 简单类型命名

使用typedef自定义的简单类型命名全部使用小写字母,用_连接,以_t结尾。例如:

typedefint32_taos_status_t;

2.3.2. 结构体和联合体命名

结构体和联合体类型命名全部使用小写字母,用_连接。建议使用typedef定义一个整体的名字,以_t结尾。例如:

typedefstructaos_list_node{structaos_list_node*prev;structaos_list_node*next;}aos_list_node_t;staticaos_list_node_tlist_node;

2.3.3. 枚举命名

枚举类型命名全部使用小写字母,用_连接。建议使用typedef定义一个整体的名字,以_t结尾。枚举值命名全部使用大写字母,用_连接,包含表示类型的前缀。例如:

typedefenumaos_socket_stage{AOS_SOCK_STG_DISCONNECTED,AOS_SOCK_STG_CONNECTED,}aos_socket_stage_t;staticaos_socket_stage_tsock_stage=AOS_SOCK_STG_DISCONNECTED;

2.4. 变量命名

变量命名全部使用小写字母,用_连接。数组名称尽量使用复数名词。例如:

cfg_file_tcfg_files[NUM_CFG_FILES];

表示数目的变量名称使用num(number的缩写)加复数名词。例如:

unsignedintnum_files;

表示序号的变量名称使用单数名词加num或index或idx(index的缩写)。例如:

unsignedintfile_num;unsignedintfile_index;

2.5. 函数命名

函数命名全部使用小写字母,用_连接。

2.6. 宏命名

一般的宏命名全部使用大写字母,用_连接。例如:

#defineAOS_STRING_MAX_LEN127

模拟函数使用方式的宏的命名规则与函数相同。例如:

#defineaos_dev_set_id(dev,x)\do{\(dev)->id=(x);\}while(0)

2.7. 前缀

为防止命名空间污染,公用组件中的非static函数、非static全局变量、全局类型、全局宏的命名应带有前缀。例如(假设前缀为aos):

voidaos_cfg_file_close(intfd);externchar**aos_process_argv;typedefstructaos_list_nodeaos_list_node_t;#defineAOS_STRING_MAX_LEN127

3. 格式

3.1. 文本格式

源文件、头文件、Makefile等文本文件一律采用UTF-8 without BOM编码,采用Unix风格换行格式。文本文件末尾应有且只有一个换行符,即末尾应有且只有一个空行。

3.2. 行长度

每行字符数原则上不超过120。包含长路径的#include语句、头文件#define保护可以无视此规则。

3.2.1. 表达式换行

较长的表达式可在运算符处换行,换行处的运算符属于旧行,新行对齐到旧行中的相同逻辑层级。例如:

voidfoo(void){if((aos_list_next(list_node)!=&list_head&&!priv)||!(strcmp(symbol,default_symbol)&&blahblahblahblahblahblah()&&meomeomeomeomeomeomeomeomeomeomeomeomeomeomeomeo(NULL))){/*...*/}}

3.2.2. 函数换行

较长的函数定义、声明可在返回值类型和函数名称之间换行。若返回值为指针类型,*属于新行。例如:

staticunsignedlongblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah(void);staticconstmanager_priv_t*blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblah(intindex);

较长的函数定义、声明、调用可在参数列表中间换行,参数列表中间换行后新行应缩进至旧行第一个参数处。例如:

voidblahblahblahblahblahblahblahblahblah(manager_priv_t*priv,intindex,constchar*proc_name);voidfoo(void){blahblahblahblahblahblahblahblahblahblah(get_manager_priv(manager),0,"meomeomeomeomeomeomeomeo");}

3.2.3. 字符串换行

较长的字符串可在空格处换行,一般情况下换行处的空格属于旧行。例如:

voidfoo(void){printf("TheGNUoperatingsystemconsistsofGNUpackages""(programsspecificallyreleasedbytheGNUProject)""aswellasfreesoftwarereleasedbythirdparties.\n");}

3.3. 缩进

使用空格缩进,每次4个空格。全文不应出现制表符(tab)。例如:

voidfoo(unsignedintnbr_processes){unsignedinti;while(i

宏定义、行尾注释、结构体、联合体、枚举等内部可缩进实现多行对齐,但不作强制要求。若有缩进,应对齐到4的整数倍。例如:

/*此处数字0缩进32个字符,即位于第33列。*/#defineSTAGE_UPDATE_CONTINUE0#defineSTAGE_UPDATE_COMPLETE1/*合法*/#defineEVENT_RX_FULL(1U<<0)#defineEVENT_TX_EMPTY(1U<<1)typdefenumsocket_stage{/*此处等号缩进32个字符,即位于第33列。*/SOCK_STG_DISCONNECTED=0,SOCK_STG_CONNECTED=1,}socket_stage_t;/*此处反斜杠缩进40个字符,即位于第41列。*/#defineaos_dev_set_flags(dev,x)\do{\(dev)->flags=(x);\}while(0)/*合法*/#defineaos_dev_set_ops(dev,x)\do{\(dev)->ops=(x);\}while(0)/*此处注释缩进24个字符,即位于第25列。*/foo(NULL);/*abc*/blahblahblahblahblah();/*xyz*//*合法*/foofoofoo();/*abc*/foofoo();/*xyz*/

分行定义的宏,第二行起应缩进一次。例如:

#defineaos_dev_set_id(dev,x)\do{\(dev)->id=(x);\}while(0)

switch块中的case语句和default语句与switch语句缩进层级相同。例如:

switch(stage){caseSOCK_STG_DISCONNECTED:foo();break;caseSOCK_STG_CONNECTED:sock->connected=1;break;default:break;}

3.4. 花括号

函数体的左花括号另起一行;其他情况下左花括号不另起一行。一般情况下左花括号后续内容另起一行;宏定义中、数组、结构体、联合体初始化时若花括号中内容较短则左花括号后续内容可以不另起一行。一般情况下右花括号另起一行;宏定义中、数组、结构体、联合体初始化时若花括号中内容较短则右花括号可以不另起一行。右花括号与后续内容组合成一行。例如:

typedefstructmanager_priv{intindex;void*data;}manager_priv_t;#defineset_manager_index(x,idx)do{(x)->priv->index=(idx);}while(0)#ifdef__cplusplusextern"C"{#endifvoidfoo(void){inti=0;/*...*/if(i==0){/*...*/}else{/*...*/}}manager_priv_tpriv={0,NULL,};#ifdef__cplusplus}#endif

3.5. 空格

行尾不应有空格。三元操作符和二元操作符(获取成员的.->操作符除外)前后留有空格。例如:

x=a?b:c;v=w*x+y/z;len=x.length;priv=proc->priv;

一元操作符与参数之间不留空格。例如:

x=*p;p=&x;i++;j=--i;

逗号右侧若有内容,逗号与右侧内容之间应有空格。例如:

voidfoo(intx,inty);

分号右侧若有内容(右圆括号或另外一个分号除外),分号与右侧内容之间应有空格。例如:

for(i=0;i

圆括号内部内容与圆括号之间不留空格。例如:

len=strlen(name);for(i=0;i

圆括号与左侧关键字之间应有空格。例如:

while(1){/*...*/}if(i==0){/*...*/}

圆括号与左侧函数名之间不留空格。例如:

intload_file(constchar*name){foo(0);/*...*/}

类型转换中的圆括号与右侧内容之间不留空格。例如:

manager_priv_t*priv=(manager_priv_t*)p;

方括号与左侧内容、内部内容之间不留空格。例如:

c=name[i];

左花括号左侧或右侧若有内容,左右内容与左花括号之间应有空格。右花括号左侧若有内容,左侧内容与右花括号之间应有空格;右花括号右侧若有内容(分号、逗号除外),右侧内容与右花括号之间应有空格。例如:

#defineset_manager_index(x,idx)do{(x)->priv->index=(idx);}while(0)manager_priv_tpriv={0,NULL,};

分行定义的宏,\与左侧内容之间应有空格。例如:

#defineset_manager_index(x,idx)\do{\(x)->priv->index=(idx);\}while(0)

3.6. 指针

指针声明或定义时,*应靠近变量名称。*与修饰符之间应有空格。例如:

int*p;constchar*name;void*constptr;void(*func)(void*arg);

3.7. 数值常量

十六进制数字A~F使用大写形式。表示二进制的前缀0b和表示十六进制的0x使用小写形式。后缀UL使用大写形式。后缀f使用小写形式。表示幂的ep使用小写形式。例如:

unsignedintb=0b0101;unsignedintx=0xABCDEF;unsignedintu=0U;longintl=0L;unsignedlongintul=0UL;floatf=1.0f;longdoubleld=1.0L;doubledd=-1.5e-5;doublexd=0xA.Bp12;

3.8. 注释

使用C90风格的/* */,不使用C++风格的///**/与注释正文之间应有空格。行尾的注释和代码之间应有空格。完整语句注意首字母大写和标点符号,简单词组可以不使用标点。注意区分中英文标点。TODO:使用特定注释格式可利用doxygen等自动化工具生成文档。例如:

/**ThissourcefileispartofAliOSThings.*ZhangSan*2021.07.01*//*ZhangSan*2021.07.01*//*ThispointermustNOTbeNULL.*//*connecting*/

4. 头文件

4.1. 路径

为避免与第三方库的头文件命名冲突,公用组件的头文件应存放于子目录中,引用时路径包含子目录名称。例如:

#include

4.2. 引号和尖括号

只有包含与本源文件处于同路径中的头文件时使用引号,其他情况均使用尖括号。例如:

#include#include"my_demo.h"

4.3. 包含次序

包含头文件的次序如下:|次序 |种类| |-:- |:-| |1 |C语言标准库头文件和工具链头文件| |2 |公用组件的头文件| |3 |本工程头文件|

例如:

#include#include#include#include#include"my_demo.h"

4.4. 保护

所有头文件都应该使用#define保护来防止被重复包含。相关宏命名格式是PATH_FILE_H。例如,头文件aos/common.h可按如下方法保护:

#ifndefAOS_COMMON_H#defineAOS_COMMON_H/*全部内容*/#endif/*AOS_COMMON_H*/

4.5. 函数、变量声明

头文件中的函数声明不使用extern关键字。头文件中的全局变量声明使用extern关键字。例如:

voidaos_cfg_file_close(intfd);externchar**aos_process_argv;

4.6. extern "C"关键字

公用头文件中声明的函数和全局变量应该使用extern "C"关键字修饰。#include不应使用extern "C"关键字修饰。#define、类型定义不作要求,可酌情考虑。例如:

#ifndefAOS_COMMON_H#defineAOS_COMMON_H#include#defineAOS_STRING_MAX_LEN127#defineAOS_LSTRING_MAX_LEN511typedefstructaos_tm{unsignedintsec;unsignedintmin;unsignedinthour;unsignedintmday;unsignedintmon;unsignedintyear;}aos_tm_t;#ifdef__cplusplusextern"C"{#endifexterncharaos_process_symbol[AOS_STRING_MAX_LEN+1];voidaos_start(void);#ifdef__cplusplus}#endif#endif/*AOS_COMMON_H*/

5. 其他注意事项

只在本编译单元使用的函数、全局变量应使用static修饰符。在不影响功能的前提下,指针类型的函数参数尽量使用const修饰符。自增、自减运算符单独使用时采用后置形式。数组、结构体初始化列表、枚举类型定义中的最后一个成员之后应有逗号。例如:

intoffsets[]={0,1,};

------------END------------

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

相关阅读

精彩放送

92号汽油一升等于几斤_1升汽油多重

每日快报!毛毯只晒不洗可以吗(毛毯只晒不洗行不行)

狂战二次觉醒多少级(狂战二次觉醒)

脲酶是胞内酶还是胞外酶 脲酶

当前关注:鱼籽的做法大全家常菜_鱼籽的做法大全

世界短讯!联想g470加装固态硬盘改装_联想g470加装固态硬盘

世界观点:山西:2023年第四批入库科技型中小企业名单

第一创业证券:变更主要股东完成股份过户 北京国管成第一大股东-最新资讯

全球观热点:福建省支持福州、泉州、龙岩等建设千兆城市

世界快看:小说阅读网作家中心林子抒情诗选小说哪里可以看_小说阅读网作家中心

“链”上发力 山东担保提升普惠金融供给力 环球快看

问界创始人称与华为已不分你我-天天热闻

环球热点!云天化05月30日获沪股通增持83.86万股

天天热点评!全国有色金属标委会调研广域铭岛 探讨有色金属行业智造标准研制工作

劳烈斯伤愈复出,特索涅夫激励球队,大连人队继续战斗! 全球焦点

每日热议!专属康巴什的初夏滤镜

“2023中关村论坛——科技服务创新发展论坛”举办_环球聚焦

面料克重测量仪_面料克重

业内人士:随着高估值隐忧基本出清 当前基础设施REITs具备较好的分红吸引力

沪深股通|东软载波5月30日获外资买入0.10%股份|环球今热点

【全球热闻】星云股份(300648):5月30日北向资金减持2.58万股

全球快播:宋仲基爸爸接受采访_宋仲基爸爸发声

焦点快看:儋州毒品预防教育进校园系列活动启动

2023/24年度澳大利亚小麦产量将同比减少26%_天天观热点

焦点播报:上海整治违规打新,总价近亿红盘云锦东方叫停摇号,重点审核假结婚问题

香港5间巴士公司6月18日起加价

环球简讯:习近平主持召开二十届中央国家安全委员会第一次会议强调 加快推进国家安全体系...

从运动健将到娱乐明星,给阿拉蕾当了次爸爸,董力人气这么高?

天天微头条丨万科:提名郁亮、祝九胜为执行董事候选人

焦点要闻:学生缴了学费还能退吗现在(学生缴了学费还能退吗)

天天即时看!香港调低新冠疫情应变级别

小孩儿大便干燥拉不出来怎么办?_小孩大便干燥怎么办

巴斯特的歌谣_巴斯滕

水蛇_关于水蛇简述 当前视点

负反馈电路的工作原理_负反馈-视讯

wowgirlsnikia合集下载_wowgirls nikia全集

多部门携手推进国道G228线泉港前黄段建设|焦点观察

焦点信息:最新五年高考真题_对于最新五年高考真题简单介绍

环球快讯:京东发布618预售战报 京东服饰预售订单额整体增长超90%

最新快讯!ddm表示什么_DDM指的是什么

体系审核员报考条件最新_体系审核员报考条件

吞天巨蟒txt(吞天巨蟒) 全球看热讯

新动态:海尔智家:回购82万股H股及7万股A股

全球今日讯!N·sight|北京清森学校更名;广州教育局发布2023年工作要点

阴雨天气小麦咋储存?发芽小麦如何“二次利用”?农业专家解答来了_全球时快讯

全球快资讯:河南电线电缆厂带你了解电线电缆电压等级

热点评!新疆2023年二级建造师考试准考证官网打印入口

【原】莫言的月亮 每日精选

国家市场监管总局无条件批准微软公司收购动视暴雪股权案 每日观点

全球报道:上海老博会,他们关心啥?

荣耀90系列发布,2亿像素相机|世界微速讯

中国星辰 | 170秒多视角回顾“神十六”升空瞬间

【环球播资讯】拟花8000万元投基金 田野股份收到北交所问询函

全球今日讯!dnf官方网站安全中心_ndf官方网站

美国白宫:总统拜登和英国首相苏纳克将讨论北爱尔兰问题。

分子锚创造更有效的CART免疫疗法

环球消息!山东养老金上调方案2023最新进展 山东调整2023退休养老金方案细则公布时间

92号的车加95号汽油会怎么样(92号汽油和95号汽油能混加吗?)|每日速读

世界短讯!万通发展:控股股东向鼎耘投资转让公司5.12%股份

外媒:一名沙特航空员工在黎巴嫩首都被绑架 环球精选

当前资讯!红利税扣税规则_红利税

平行四边形的判定 试讲稿

年货节文案标题_年货节文案 动态

产生性状分离的原因_性状分离的原因|世界快看

环球聚焦:2023中关村论坛|血管介入手术机器人、人工关节产品黑钻球头……这些医疗器械看点多

全球通讯!首发7折 联想65W氮化镓插排明天开售:出差不用带电源了

河南下拨2亿用于小麦烘干 确保农民收益-全球球精选

宇新股份(002986.SZ)6737.5万股限售股份将于6月2日上市流通

当前信息:咸宁市崇阳县大市村党支部书记程桔——党的富民政策让山村长出“金疙瘩”

郑州12320热线24小时受理爱国卫生建议与投诉

世界快消息!湘佳股份: 关于调整湘佳转债转股价格的公告

南网储能将于6月6日解禁6.31亿股

唐雪峰任四川省疾病预防控制局局长

全球快消息!迷你挑战阿卡莱地区伫立月下的卓拉公主攻略

祝贺!第二次“太空会师”

青海中级会计职称报考有年龄限制吗? 天天快看

布展各类图书2000余册 姑苏区机关书市暨专题阅读活动启动 天天信息

新房客入住!神十六乘组进驻空间站|当前消息

美女帅哥在一起很难长久_帅哥美女在一起能长久

市场指导价52.18万元 奥迪S4 Avant正式上市-当前滚动

打破垄断!中国又“摘下”一颗工业皇冠上的明珠 每日热讯

征集志愿怎么报四川(征集志愿怎么报)

当前快看:中国探月工程标志的构图及寓意(中国探月工程标志)

人行抚顺市中支开展存款保险集中宣传月系列活动_全球观焦点

平顶山高新区:政务赋能强动力 优化服务添活力-环球观热点

官宣王一博成为代言人 老板电器再次打出“王炸” 全球速读

黄金空头反扑需盯紧这一支撑

【天天播资讯】ppt转换成pdf在线(ppt转换成pdf)

世界快播:教育部办公厅关于公布2023—2024学年招收本科临床医学专业(英语授课)来华留...

蜂蜜功效与作用及禁忌症(蜂蜜功效与作用及禁忌)

崔东树:汽车行业利润下滑幅度改善,但利润率仍偏低 环球今头条

23061期双色球晒票,我绝不低头,我永不后退​​​​​​​|全球热点评

ps怎么后退一步快捷键(ps怎么后退) 最资讯

天津:环境资源审判案件类型多样,主要责任承担方式有这些……

世界快资讯:足协公开遴选U15男足国家队教练团队,目标力争U17世界杯参赛资格

天天速看:回光返照有科学依据吗(回光返照的科学解释)

“85后”博导变身中国航天员,我也可以吗?

相约美丽雁江:吃小龙虾,观龙舟赛!

国家发展改革委:5月30日24时起国内汽、柴油价格每吨分别提高100元和95元 当前观点

中国银行(03988.HK):预计2025年到期20亿元票据的上市将于5月31日开始生效

国漫脑残粉有多无知?“你行你上”已成病态,付钱了还没资格评论

破解开机密码的方法是什么(破解开机密码)

环球动态:珠海港:目前回购计划正处于有序推进中,公司将根据二级市场股价走势和自身资金...

天天快讯:戴尔官网(戴尔640m)

职观丨00后整理收纳师:收纳有治愈的力量,年轻人更愿把时间花在自己身上

中国贸促会:3月全球经贸摩擦指数处于高位 较上月有所下降

12个重点项目总投资超50亿元 太仓高新区举办五月“项目突破日”活动

女孩考第一被老师质疑后溺亡 到底发生了什么?【图】