在浏览了一些旧代码之后,我注意到有些类是以这种方式定义的:
MIDL_INTERFACE("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
Classname: public IUnknown {
/* classmembers ... */
};
但是,宏MIDL_INTERFACE
定义为:
#define MIDL_INTERFACE(x) struct
在C:/MinGW/include/rpcndr.h(第17行左右)。宏本身显然完全没有意义,那么这个宏的真正目的是什么呢?
答案 0 :(得分:9)
在宏扩展为
的Windows SDK版本中 struct __declspec(uuid(x)) __declspec(novtable)
第一个允许使用__uuidof关键字,这是从typename获取接口guid的好方法。第二个禁止生成v-table,一个从未用于接口的表。空间优化。
答案 1 :(得分:3)
这是因为MinGW不支持COM(或者更确切地说,支持它非常糟糕)。定义COM组件时使用MIDL_INTERFACE,它由IDL compiler生成,它为您生成COM类型库和类定义。
在MSVC上,此宏通常会扩展为更复杂的初始化和注释,以将给定的C ++类公开给COM。
答案 2 :(得分:0)
如果我不得不猜测,那是两个用例中的一个:
可能有一个外部工具可以解析查找这些声明的文件。这个想法是,通过让宏评估为无害的东西,代码本身编译得很好,但外部工具仍然可以查看源代码并从中提取信息。
另一种选择可能是代码使用X Macro Trick之类的东西来有选择地重新定义这个预处理器指令的含义,以便代码的其他部分可以用其他方式解释数据。取决于#define
的位置,这可能是也可能是不可能的,但这似乎是合理的,这可能是用例。这基本上是第一个选项的特例。