interface_sdk_c/docs/capi_naming.md

84 lines
4.8 KiB
Markdown
Raw Permalink Normal View History

# C API接口编码规范
## 1 简介
### 1.1 目的
OpenHarmony提供了一些C语言系统接口供三方应用开发者使用为了规范SDK C API的接口对外提供一个统一接口风格防止出现不必要的符号冲突特此制定了此规范。
此规范对接口的命名规则接口头文件stub库在SDK包中的目录结构进行约束。2章节介绍了OpenHarmony的接口命名规范。
### 1.2 术语定义
* __规则__必须遵守的设计规则。
* __建议__必须加以考虑的约定规则。
* __说明__对规则进行必须要的解释。
* __示例__对规则的举例说明。
* __例外__对规则的举例说明。
### 1.3 约定
* 此规范描述的路径都是指SDK包中相对于Native包中的目录不是指代码仓中的原始路径。
* 全文xxx表示接口功能模块名类比于C++中的类名aaabbb表示普通的函数名文件名。
## 2 C API接口命名规则
在C API中出现的接口分为两类
1. 业界标准接口或者是生态约定俗成的接口如libcopengles
2. OpenHarmony自研接口
### 2.1 业界标准接口命名规则
#### 2.1.1 【规则】已有业界标准的C API接口命名规则按照业界标准来命名。
__举例__
1. libc/libc++采用的是unix_like的命名规则
2. opengl接口规范采用<库前缀><根命令><可选参数个数><可选参数类型>格式;
__说明__针对第三方标准中根据平台要求扩展的接口也按照此三方库的推荐命名方式。
### 2.2 自研接口命名规则
#### 2.2.1 【规则】C API接口函数标识符命名规则采用OH_<模块前缀>_<方法名>的方式,命名需要精准,模块前缀采用大驼峰,方法名采用大驼峰规则。
__说明__采用C语言接口符号是全局课件容易与别的模块符号产生符号冲突采用模块前缀进行作用域区分。
#### 2.2.2 【规则】模块前缀需要精准描述接口具体功能模块名字需要接口领域SIG组审议通过。
__说明__模块前缀相当于C++中的类名,不要采用一些通用的名词,或者是范围过大的名字;
__举例__OH_AI_xxxAI这个一般指的是一个行业一类技术的名词这类名词座位模块名字不合适。
#### 2.2.3 【建议】接口文件中其他类型命名规范基础类型建议都进行typedef进行定义。
|类别|命名风格|形式|
|----|----|----|
|【建议】结构体类型枚举类型联合体typedef类型|带模块前缀的大驼峰|采用Xxx_AaaBbb|
|局部变量,函数参数,宏参数,结构体字段,联合体成员|小驼峰|aaaBbb|
|全局变量|带g_前缀的小驼峰|g_Xxx_aaaBbb|
|宏不包括函数式宏枚举值goto标签|全大写,下划线分割|XXX_BBB|
|函数宏|带模块前缀的大驼峰|OH_Xxx_AaaBbb|
|常量在函数外部定义由const修饰的基本数据类型枚举类型字符串类型|全大写下划线分割,或带'g_'前缀的小驼峰|XXX_BBB, g_Xxx_aaaBbb|
### 2.3 头文件命名规则
#### 2.3.1 【规则】头文件文件名采用unix_like的命名规则名词与名词间用"_"隔离。
__举例__采用xxx_aaa.h xxx_aaa_bbb.h或者xxx/aaa.h xxx/aaa_bbb.h。
__说明__如果此头文件在sysroot的include目录下的路径中已经包含xxx模块名头文件的文件名就不需要带xxx前缀。
#### 2.3.2 【规则】自研接口头文件放置在sysroot/usr/include规则在此目录下创建子系统目录名字上APP SIG评审放置到此子目录下。
__说明__子系统下的目录组织形式可以采用模块名目录加头文件的形式或者采用模块名_文件名.h方式不建议新建太深的目录结构开发者代码在引用头文件的时候需要引用长串路径不友好。
```
|--include
| |--领域组名(需要上API SIG评审)
| | |--xxx
| | | |-- aaa.h
| | | |-- bbb.h
| | |
| | |--xxx_ccc.h
| | |--xxx_common.h
```
#### 2.3.3 【规则】三方库头文件按照生态的习惯放置可以不遵守2.3.2规则。
### 2.4 库文件命名规则
#### 2.4.1 【建议】库文件放置在sysroot/usr/lib根目录不用建子目录文件名采用unix_like的命名规则不用z.so结尾。
__说明__是否需要给C API接口独立创建一个so库这个没有强制要求如果C API接口是重新封装建议独立一个库因为C API接口实现库在镜像中必须放置到/system/{lib|lib64}/ndk目录方便接口管控。
__说明__命名采用libxxx.so的命名方式库名字最好与模块名字相同如果包含多个模块建议采用业界常用的名字如果名字是常用单词建议前面加oh前缀如libohxxx.so避免名字冲突。
#### 2.4.2 【规则】三方库的名字按照生态约定的名字命名。