• 在定义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 };
    复制代码

    通过这样修改,经过测试,可以解决我的问题。

  • 相关阅读:
    day074:XML、XML的解析
    【一天一题—Day17】623. 在二叉树中增加一行
    SANSAN每周新鲜事|OPC UA 数据采集,你真的了解吗?
    生成式AI的新战场:逻辑推断与推理计算
    LeetCode --- 1356. Sort Integers by The Number of 1 Bits 解题报告
    上位机程序,上位机界面开发,ATECLOUD中国人自己的LabVIEW
    【网络安全】--win提权
    138. 随机链表的复制
    过了那么多1024节才知道……
    5.27 picker组件
  • 原文地址:https://www.cnblogs.com/setoutsoft/p/16120558.html