C++ 毫无意义';MIDL#U接口';winapi中的宏?

C++ 毫无意义';MIDL#U接口';winapi中的宏?,c++,winapi,mingw,C++,Winapi,Mingw,浏览了一些旧代码后,我注意到有些类是这样定义的: MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX") Classname: public IUnknown { /* classmembers ... */ }; 但是,宏MIDL_接口定义为: #define MIDL_INTERFACE(x) struct 在C:/MinGW/include/rpcndr.h中(在第17行附近)。宏本身显然是毫无意义的,那么这个宏的真正目的是

浏览了一些旧代码后,我注意到有些类是这样定义的:

MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
Classname: public IUnknown {
    /* classmembers ... */
};
但是,宏
MIDL_接口
定义为:

#define MIDL_INTERFACE(x) struct

在C:/MinGW/include/rpcndr.h中(在第17行附近)。宏本身显然是毫无意义的,那么这个宏的真正目的是什么呢?

如果我不得不猜测的话,它是针对以下两个用例之一:

  • 有可能存在一个外部工具来解析文件,以查找类似这样的声明。其思想是,通过让宏对无害的内容求值,代码本身就可以编译得很好,但是外部工具仍然可以查看源代码并从中提取信息

  • 另一种选择可能是,代码使用类似的东西选择性地重新定义此预处理器指令的含义,以便代码的其他部分可以以其他方式解释数据。根据
    #define
    的位置,这可能是可能的,也可能是不可能的,但这似乎是合理的用例。这本质上是第一种选择的特殊情况


  • 这是因为MinGW不支持COM(或者说,它的支持非常差)。定义COM组件时使用MIDL_接口,它由生成COM类型库和类定义的生成


    在MSVC上,这个宏典型地扩展到更复杂的初始化和注释,以便将给定的C++类暴露到COM../P>< P>在Windows SDK版本中,宏扩展到

     struct __declspec(uuid(x)) __declspec(novtable)
    

    第一种方法允许使用u_uidof关键字,这是从typename获取接口guid的好方法。第二种方法禁止生成v表,该表从未用于接口。空间优化。

    谢谢,我根本不知道MinGW支持COM,即使很差(我不打算从一开始就使用COM;-)@Nebukadnezar:我相信你可以有限地使用COM,但你不能在MinGW中公开新的COM类型。它还缺少几个Windows COM头。我可能错了,我已经有一段时间没用MinGW了。(顺便问一下,你为什么要帮机器?我要告诉锡安…)别管那件事——我把尼布卡尼撒读作哈哈,好吧,我的名字对《黑客帝国》一点也不陌生。。我发誓D