文档章节

SDK开发C++接口定义潜规则

赫拉蒂姆
 赫拉蒂姆
发布于 2017/08/12 14:23
字数 1168
阅读 9
收藏 0

前言  

  在很大很大的生产环境中,我们工作只是生产过程的一个环节,这就导致了我们经常会使用别人提供动态库,组件,插件等等,我们也会提供给别人相同的东西可以让我们的产品接入到他人的产品中。但是东西多了,迭代久了,业务膨胀,越来越多人使用总会出现这样那样的问题,越往后期,大家更多的是关心你提供什么功能,如何使用功能,以及接下来要说的接口。

 

原则

   接口定义需要考虑东西很多,系统性,兼容性,易用性等等。

   1. 接口定义需要通俗易懂,符合使用者习惯, 人们更多关心函数名字,参数类型,对文档关心程度并不高,通俗易懂的接口会减少使用者查阅文档时间,也减少我们自己的时间。

   2. 接口必须做到兼容性,而且已做好接口不能改动, 别人用了你的接口, 如果改动会导致使用者的代码改动,使用人一定情绪,所以要么内部适配,要么新增接口以满足新的需求,命名上面尽量使用版本相关后缀例如_V1, _V2。少用Ex,各个版本的接口风格要尽量一致。

   3. 资源最好能在使用的时候加载,可通过设定初始化反初始化接口,要和业接口配合, 相同的业务功能使用相同的接口。

   4. 常用日志,错误码,断言。日志包括Debug/Error/Inf三个等级,错误码不可重复,如果使用他人提供SDK,错误要尽量兼容, 否则使用错误模块类型 + 错误码。断言能保证程序健全性,但需要非常熟悉代码。

 

注意事项

不要申请过大的栈内存

   当接口被过多的封装,层层嵌套,软件运行过程中,栈资源就很紧张,如果申请过大内存,当程序运行就会导致栈溢出。实际栈的大小只有2M,申请栈内存最好不大于10k,堆栈都是内存,不同就是栈内存使用完自动释放,堆内存需要new/malloc,使用完需要手动释放。

谁申请谁释放。

   不要内部申请了内存,外部释放,或者外部申请内存内部释放。这样在堆上申请很难定位,并且难以找到真正错误位置。

输入参数拷贝走

   外部传入的参数,特别是申请堆内存,内部如果要使用不要直接使用参数,最好能拷贝到内部申请的变量里。

字符指针参数加个长度

   字符串参数有传递通过字符指针char *p,可以对外提供指针长度Len,内部很难控制指针,不能判定*p内存到底来自哪里,是否转换,是否正确,所以加入长度以确定实际内存大小。

字节对齐

    字节对齐在结构体上问题较多,上面说到申请栈内存不要过大,同样申请一个结构体也可能出现问题,可能结构体本身也很大,尽量拆分结构体。有时使用者使用强制字节对齐,会导致结构体实际占用内存不同。

结构体内部定义使用数组

    结构体内部尽量使用数组或结构体数组,不要使用指针或长度,如果是堆内存很难定位,扩展性可以加入byte[Num]数组,长度大小可以通过是否扩展判断,如果扩展很多参数长度可以很大一般(64 - 256)

线程安全

    要保证接口线程安全,如果是初始化反初始化本身无法做到线程安全,但初始化后所有接口调用都要保证线程安全, 需要查看是否有全局变量,适当加锁。

使用回调用户自定义数据

    回调的时候使用用户自定义数据 void* pUserData,通过强转能获取使用者定义数据结构,通过数据结构调用相关回调函数。

 

 

© 著作权归作者所有

共有 人打赏支持
赫拉蒂姆
粉丝 0
博文 7
码字总数 6300
作品 0
齐齐哈尔
私信 提问
MFC、SDK和API有什么区别

MFC、SDK和API有什么区别 MFC Microsoft Foundation Class 微软函数类库 SDK (Software Development Kit,软件开发包) 软件开发包通常是一系列API函数,而MFC 是由微软公司提供的对API封装...

huanongkou
2013/03/20
0
0
这么多人晒简历,我也来一个,赶紧喷吧。。。

计算机语言: 熟练: C/C++ (10年) 掌握: Java、 C#(WPF)、Python、 Pascal、awk, scala、F#、Linux Bash Shell等语言,并能用于辅助C/C++,提高工作效率。 C/C++语言库(熟练的掌握) ST...

newzai
2013/09/16
4.6K
38
OpenWRT开发之——对C++的支持(解决库依赖问题)

C++是本人的强项。如果在OpenWrt中不能用C++进行开发,那就有点大失所望了。 接下来将与大家一起来尝试写一个C++程序,并把它做成 ipk 包,并试运行。 各文件内容 在 SDK/package/ 路径下创建...

临峰不畏
2015/05/07
0
9
用 7Zip 的 LZMA SDK 压缩解压数据

由于项目需要,研究了一把LZMA SDK。不知道7zip的那帮弟兄太忙还是不喜欢写使用手册,翻遍整个SDK也没找到一份完整的使用说明,只有两个可 怜的7zC.txt和lzma.txt可以参考。这篇文章就当作是...

鉴客
2010/05/18
11.8K
2
Android NDK开发简介

最近由于项目的需要,使用到了Android的NDK技术,对项目核心算法跨平台的移植。简答而言,就是使用C对原来的算法进行了改进,并集成到原来的app项目里。 从前的项目一直没有使用NDK进行开发的...

zhiweiofli
2013/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

即学即用,轻松搞定这些选择器!(上)

所谓基本选择器是指选择器的名称前面没有其他选择器,即在组成上,基本选择器是单一名称。 基本选择器主要包括: 元素选择器 ID 选择器 类选择器 伪类选择器 伪元素选择器 通用选择器 元素选...

我的卡
4分钟前
1
0
c直接操作JAVA中的数组

** * jni对数组运算 * 在C中没有创建新的数组副本,直接在原来的java数组上面修改。然后返回了jintArray类型数据 */ JNIEXPORT jintArray JNICALL Java_com_org_vincent_javacallc_JNI_incr...

whoisliang
13分钟前
1
0
简单理解闭包问题

从我16年开始接触前端,知道闭包这个词,已经过去两年了。这两年里,闭包这个概念我在很多地方了解过,却实在没有真的理解,久而久之,变成了一块心病。这不,趁着现在项目告一段落的时间,我...

IrisHuang
13分钟前
2
0
网站漏洞怎么修复对于thinkphp的漏洞修复

THINKPHP漏洞修复,官方于近日,对现有的thinkphp5.0到5.1所有版本进行了升级,以及补丁更新,这次更新主要是进行了一些漏洞修复,最严重的就是之前存在的SQL注入漏洞,以及远程代码执行查询系...

网站安全
13分钟前
1
0
docker 安装oracle11g

1.准备docker环境; 2. docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g --pull 镜像(6个多G) 3.docker run -d -p 1521:1521 -v /data/oracle:/data/oracle --name ora......

xiaoxin
14分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部