zoukankan      html  css  js  c++  java
  • VS2012中使用纯C实现COM的小问题

        用VS2012新建C++工程都预定义了宏__cplusplus,所以引用到的都是C++的定义。但是要用C实现的话,一般都是也就不是C++的了。比如以下代码:

    #undef  INTERFACE
    #define INTERFACE   IExample
    DECLARE_INTERFACE_ (INTERFACE, IUnknown)
    {
        STDMETHOD  (QueryInterface)        (THIS_ REFIID, void **) PURE;
        STDMETHOD_ (ULONG, AddRef)        (THIS) PURE;
        STDMETHOD_ (ULONG, Release)        (THIS) PURE;
        STDMETHOD  (SetString)            (THIS_ char *) PURE;
        STDMETHOD  (GetString)            (THIS_ char *, DWORD) PURE;
    };

        C版本的宏DECLARE_INTERFACE_和C++版本的宏就不是同一个东西。在C中没有class的概念,所以这里使用了struct,而且在C版本中在宏中已经设置了Vtbl,这是最大的区别。C版本的DECLARE_INTERFACE_:

    #define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
    
    #define DECLARE_INTERFACE(iface)    typedef interface iface { 
                                        struct iface##Vtbl FAR* lpVtbl; 
                                    } iface; 
                                    typedef struct iface##Vtbl iface##Vtbl; 
                                    struct iface##Vtbl

    C++版本的DECLARE_INTERFACE_:

    #define DECLARE_INTERFACE_(iface, baseiface)            interface DECLSPEC_NOVTABLE iface : public baseiface

        但奇怪的是__cplusplus没有undef的情况下,也可以声明IExampleVtbl对象,但就是会有红色的波浪线,提示是未定义的标识符,同时能顺利编译通过。而这点也是困惑我的地方。按道理,如果没有undef __cplusplus的话,cl应该执行的是C++版本中的宏。但是其中有一个重要点是文件是以c结尾。对于cl是否是根据文件后缀来选择编译还是根据其他规则也就不得而知了,因为对cl没有太多了解。至少如果文件是以c为后缀的话,编译器能够选择正确的宏版本来执行代码这点是没错的。

        因为在编译器中没有undef __cplusplus,宏的定义是直接定位到对应的C++版本的,而这会干扰到我们正常的代码编写,如果我们忘记了的话。比如这个宏:

    REFCLSID
    C++版本:
    #define REFCLSID const IID &
    C版本:
    #define REFCLSID const IID * __MIDL_CONST
    就明显有本质的区别。我们编写的是C代码,但是调到定义处看的定义却是C++版本。一般会出现类似类型不匹配的情况。这点是尤其应该注意的。
  • 相关阅读:
    Android组件化和插件化开发
    开发一流的 Android SDK:Fabric SDK 的创建经验
    关系 和非关系 阻塞非阻塞的区别
    AJAX 中JSON 和JSONP 的区别 以及请求原理
    九马画山数命运, 一身伴君不羡仙! 与代码不离不弃!
    移动端 transitionEnd函数用来检测过渡是否完成
    2017前端该学的知识 分享墨白的文章、大家共勉!
    移动端和pc端事件绑定方式以及取消浏览器默认样式和取消冒泡
    今天要带来的是移动端开发的基础内容
    离线存储
  • 原文地址:https://www.cnblogs.com/navono007/p/3283630.html
Copyright © 2011-2022 走看看