文档章节

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

赫拉蒂姆
 赫拉蒂姆
发布于 2017/08/12 14:23
字数 1168
阅读 3
收藏 0
点赞 0
评论 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
博文 5
码字总数 6300
作品 0
齐齐哈尔
AndroidStudio3.0NDK输出多个so库

个人博客地址 http://dandanlove.com/ 前言 去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,...

静默加载 ⋅ 04/12 ⋅ 0

Android NDK开发的一点尝试

写在前面 笔者是一个“原始”的C++开发者,对Java编程虽说不上抵触但也没有C++那么顺手。而且,作为一个游戏引擎,不管是在什么地方,效率总是第一位的,尤其是在移动平台这样资源吃紧的环境...

闪电的蓝熊猫 ⋅ 04/06 ⋅ 0

SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘 ⋅ 06/16 ⋅ 0

Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头 ⋅ 05/09 ⋅ 0

C语言编程新手基础学习:Windows编程入门

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/22 ⋅ 0

C语言编程学习,你的第一个Windows程序!

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/23 ⋅ 0

大神有话说之c++,还在迷茫的朋友可以来看一下

C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Window...

悟空_b201 ⋅ 05/30 ⋅ 0

关于工业相机编程调用SDK二次开发的一些步骤流程

网上找的一些资料,整理了一下,留着仔细看一看。 内容纲要: 1.工业相机编程模型和流程 2.工业相机SDK接口使用总结 3.Basler Pylon工业相机SDK的使用 4.Pylon 以实时图像采集讲解PylonC SD...

jack_sarah ⋅ 04/18 ⋅ 0

C语言编程基础学习如何定义一维数组和二维数组

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 04/01 ⋅ 0

C语言/C++编程新手学习常见问题

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 05/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vim介绍、vim颜色显示和移动光标、vim一般模式下移动光标、一般模式下复制粘贴剪切

VIM Vim 是 UNIX 文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff),语法高亮,全面的帮助系统,本地脚本(Vimscript),和便于选择的...

蛋黄Yolks ⋅ 17分钟前 ⋅ 0

springboot+mockito测试controller层遇到的问题

使用MockitoJUnitRunner测试的一个例子,原来报错无法找到bean, 类似的异常如下:createBeanError..... 原因:是因为@Runwith使用了SpringRunner,应该修改为MockitoJUnitRunner 代码如下: ...

writeademo ⋅ 29分钟前 ⋅ 0

关于“幂等”操作

一个幂等(idempotent)操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同. 开发中, 我们经常考虑幂等操作的场景有“接口调用”、“MQ消费”、“自动任务”等 接口调用, 可能出现...

零二一七 ⋅ 37分钟前 ⋅ 0

Dubbo服务服务暴露之ProxyFactory Invoker

Dubbo服务暴露过程中有涉及到调用ProxyFactory 中方法获取Invoker对象的过程,现在我们来深究下源码,来看下这个过程是在做些什么,返回的Invoker 对象是什么,我们来看一下代码的切入点: ...

哲别0 ⋅ 51分钟前 ⋅ 0

GP两种连接方式性能测试

GP两种连接方式性能测试 Pivotal import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class GPQueryStrin......

仔仔1993 ⋅ 55分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 今天 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 今天 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 今天 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 今天 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部