1.规范要求
1.1 遵循的基本原则
1.标识符的命名要清晰明了,有明确含义,可以采用英文单词或中文拼写表示,使用完整的拼写或者易于理解的缩写,避免使人产生误解。较短的单词可通过去掉“元音”形成缩写,较长的单词可取单词的头几个字母形成缩写,尽量使用约定俗成的公认的缩写。
2.命名中若使用特殊约定或缩写,则要有注释说明。应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说明。
3.对于变量命名,禁止取单个字符(如i 、j 、k...),但i 、j 、k 作为局部循环变量是允许的。
4.除非必要,不要用数字或特殊字符来定义标识符。
5.用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。
6.除了编译开关/头文件等特殊应用,应避免使用以下划线开始和结尾的定义。
7.在同一软件产品内,应规划好接口部分标识符(变量、结构、函数及常量)的命名,防止编译、链接时产生冲突。如可在接口部分的标识符之前加上“模块”的标识等。
8.命名规范必须与所使用的系统风格保持一致,并在同一项目中统一。
1.2 函数的命名规则
注:下文提及的单词,指具有实际含义的一个英文单词或中文拼音的完整拼写或者缩写,比如Response、Rsp。
1.函数命名规则主体上采用“帕斯卡命名法”,即采用:所有的单词首字母大写,使用一个大写字母来标记逻辑断点,举例如下:
void *MqttClientConnect(MqttClientParam *pParam);
2.如果为了区分模块层次、逻辑层次,或者使用的单词个数比较多,可以使用下划线进行断开,举例如下:
int Subscribe_BatchProPubReply(void *pClient);
3.应确保每个函数声明中的参数的名称、类型和定义中的名称、类型一致。
4.5G操作系统项目特别定义
在项目功能开发时,函数分为内部实现函数和对外API接口函数。
如果是内部实现函数遵循如上规则即可。
如果是对外API接口函数,需要提供给外部使用,需要遵守如下格式:
【UNI_模块名称_函数名称】
模块名称和函数名称,所有单词首字母大写,并且遵循如上规则,举例如下:
void *UNI_MQTT_Create(UniDevinfo *pDevinfo);
int UNI_LwM2M_Register(void *pClient, uint32_t timeoutMs);
1.3 变量的命名规则
注:下文提及的单词,指具有实际含义的一个英文单词或中文拼音的完整拼写或者缩写,比如Response、Rsp。
1.变量命名规则主体上采用“骆驼命名法”,即采用:第一个单词首字母小写,余下的单词首字母大写,使用一个大写字母来标记逻辑断点,举例如下:
char moduleTime[14] = {0x00};
int voltage = 0;
2.如果为了区分模块层次、逻辑层次,或者使用的单词个数比较多,可以使用下划线进行断开,举例如下:
char subTopic_EventBatchReply[100] = {0x00};
char subTopic_ServicePubReply[100] = {0x00};
3.对于指针、构造类型的变量,为便于区分基础类型的变量,在规则1和2基础上,增加前后缀来区分命名。
4.指针类型变量
命名时前缀增加小写字母p(一重指针)或者pp(二重指针),剩余的单词首字母大写,举例如下:
void *pClient = NULL;
void **ppDataBuff = NULL;
5.结构体、共用体、枚举类型变量
命名时前缀增加小写字母t,剩余的单词首字母大写,如果碰到是指针类型,为代码简洁考虑,可以省略t,举例如下:
ShadowProperty tProVoltage;
ShadowProperty *pProperty;
6.结构体、共用体、枚举类型名称
结构体、共用体、枚举是构造类型,所以会有类型名称的定义。
类型名称,要求所有单词首字母大写,后缀加上“-t”,而使用typedef 重命名的类型名称,要求所有单词首字母大写,没有后缀。两者命名完全一致,只是区别在是否带后缀。典型的类型名称定义如下:
typedef struct ShadowProperty_t
{
char *pkey;
ShadowDatatype tDataType;
void *pReportData;
int reportDataLen;
void *pDesireData;
int desireDataLen;
}ShadowProperty;
typedef enum ShadowDatatype_t
{
SHADOW_NULL,
SHADOW_STRING,
SHADOW_INT,
SHADOW_FLOAT,
SHADOW_BOOL,
}ShadowDatatype;
枚举类型的内部变量是常量,要求全部大写,可以使用下划线分断。
7.全局变量和静态变量
全局变量需要使用“g_”开头,剩余的单词首字母大写。
静态变量需要使用“s_”开头,剩余的单词首字母大写。
如果既是全局变量,又是静态变量,需要使用“gs_”开头。
举例如下:
char g_ProSetMsgID[20] = {0x00};
static char s_SubTopic[100] = {0x00};
8.对常量命名,要求常量名用大写,可以使用下划线分断。
9.项目特别定义
在项目功能开发时,变量分为内部使用变量、外部使用变量(如全局变量、常量等)、对接开放的构造体(结构体、共用体、枚举)类型。
如果是内部使用变量遵循如上规则即可。
如果是外部使用变量、构造体类型等,需要遵守如下格式:
【Uni+变量名称或者类型名称】、【UNI_常量】
举例如下:
全局变量:char g_UniDevAuthStr[65] = {0x00};
构造体类型:
typedef struct
{
char productKey[UNI_PRODUCT_KEY_LEN+1];
char productSecret[UNI_PRODUCT_SECRET_LEN+1];
char deviceKey[UNI_DEVICE_KEY_LEN+1];
char deviceSecret[UNI_DEVICE_SECRET_LEN+1];
char deviceToken[UNI_DEVICE_TOKEN_LEN+1];
int loginMod;
int firstReg;
int tlsMod;
}UniDevinfo;
常量:UNI_DEVICE_TOKEN_LEN
1.4 AT命名规则
AT接口按照标准规范制定,需要列出AT功能的测试、查询、设置和执行的格式,可能的响应,最大响应时间及使用举例,如下图举例:
cmd的命令规则:
UNI+模块命名+功能名称,模块名称和功能名称遵循标准的AT命名规则。
命令类型 | 命令 | 可能的响应 |
测试命令 | AT+<cmd>=? | |
查询命令 | AT+<cmd>? | |
设置命令 | AT+<cmd>=<p1>[,<p2>[,<p3>[...]]] | |
执行命令 | AT+<cmd> | |
最大响应时间 | ||
示例 |