在定义C++, C通用接口函数时让C++接口支持默认参数
在SOUI4的开发中,所有SOUI核心对象都采用了一种类似COM接口的技术来导出接口。
这所以采用这种方案,主要目的是为了让SOUI4支持C语言调用,扩展SOUI的使用场景。
众所周知,C++函数的参数支持配置默认值,但C函数是不支持默认值的。
比如定义了类似下面一个接口
1 #undef INTERFACE
2 #define INTERFACE IRenderTarget
3 DECLARE_INTERFACE_(IRenderTarget, IObjRef)
4 {
5 //...
6 STDMETHOD_(HRESULT, SelectObject)
7 (THIS_ IRenderObj * pObj, IRenderObj * *ppOldObj) PURE;
8 //...
9 };
IRenderTarget::SelectObject方法的功能是给当前的RenderTarget选择一个绘图对象,同时如果ppOldObj不为NULL,则通过ppOldObj返回当前正在使用的同类型绘图对象。
很多时候用户并不关心原来的对象,所以通常给它置为NULL即可。这也是SOUI3及之前版本的默认参数。
由于4.0中,该接口可能是在C++中引用,也可能是在C中引用,如果还是直接使用C++的方法给它设置默认参数NULL,在C中引用就会导致编译失败。
是由于这个方法是控件自绘中常用的方法,为了减少升级SOUI3的代码到SOUI4的难度,我一直在想有没有办法能够兼容两种语言的特性。
今天无意中想起来可以用一个简单的宏解决。
于是我定义了下面的宏:
1 #ifdef __cplusplus
2 #define DEF_VAL(x) =x
3 #else
4 #define DEF_VAL(x)
5 #endif//__cplusplus
有了这个宏,我们就可以同时兼容C++和C语言了,上面的接口修改如下:
1 #undef INTERFACE
2 #define INTERFACE IRenderTarget
3 DECLARE_INTERFACE_(IRenderTarget, IObjRef)
4 {
5 //...
6 STDMETHOD_(HRESULT, SelectObject)
7 (THIS_ IRenderObj * pObj, IRenderObj * *ppOldObj DEF_VAL(NULL)) PURE;
8 //...
9 };
通过这样修改,经过测试,可以解决我的问题。
在定义C++, C通用接口函数时让C++接口支持默认参数的更多相关文章
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
- Linux时间子系统之(三):用户空间接口函数
专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...
- Linux时间子系统(三) 用户空间接口函数
一.前言 从应用程序的角度看,内核需要提供的和时间相关的服务有三种: 1.和系统时间相关的服务.例如,在向数据库写入一条记录的时候,需要记录操作时间(何年何月何日何时). 2.让进程睡眠一段时间 3. ...
- Python中定义函数时参数有默认值的小陷阱
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...
- 我的c++学习(6)默认参数和内联函数
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...
- 3.C++内联函数,默认参数,占位参数
本章主要内容: 1)内联函数(替代宏代码段) 2)默认参数 3)占位参数 1.C++的内联函数分析 1.1讲解内联函数之前,首先回忆下之前讲的define宏定义: 之前讲过宏定义会经过预处理器进行文本 ...
- 【转】Python函数默认参数陷阱
[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...
- Python面试题目之Python函数默认参数陷阱
请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...
- Python进阶-函数默认参数
Python进阶-函数默认参数 写在前面 如非特别说明,下文均基于Python3 一.默认参数 python为了简化函数的调用,提供了默认参数机制: def pow(x, n = 2): r = 1 ...
随机推荐
- Golang 基础之基础语法梳理 (二)
大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第二章节 Golang 基础之基础语法梳理 (一) Gol ...
- php——字符串的""和null,empty的关系
public function test(){ $test = ""; if($test==null){ echo "test==null <hr>" ...
- 模型 _meta API ( options )
模型 _meta API class Options[源代码] 模型 _meta API是Django ORM的核心.它使系统的其他部分(如查找,查询,表单和管理员)能够了解每个模型的功能. API可 ...
- javascript函数 (二 定义函数的三种方法)
javascript定义函数(声明函数)可以有三种方法:正常方法.构造函数.函数直接量 <html><head></head><body> <sc ...
- python3 爬虫3--异常处理
本文学习内容来自:https://germey.gitbooks.io/python3webspider/content/ urllib库中有URLError类,request模块产生的错误都可以通过 ...
- Springmvc入门基础(六) ---拦截器应用demo
1.拦截器定义 Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理. 2.拦截器demo demo需求: 拦截用户请求,判断用 ...
- 用 Java 写一个折半查找?
折半查找,也称二分查找.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者小于中间元素,则 ...
- java-StringBuilder
一个可变的字符序列. String类的对象内容不可以改变,所以每当进行字符串恶拼接时,总是会在内存中创建一个新的对象,所以经常改变内容的字符串 所以最好不要用String,因为每次生成的对象都会对系统 ...
- Flask-SQLAlchemy 使用教程
Flask-SQLAlchemy ,是对SQLAlchemy进一步封装 SQLAlchemy使用教程地址: https://www.cnblogs.com/bigox/p/11552542.html ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...