1

Microsoft 的 MIDL 编译器生成的 C/C++ 源代码文件有些无效,例如此摘录中的代码:

#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED

#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

#endif !_MIDL_USE_GUIDDEF_

Visual C++ 忽略之后的标记#endif,但神圣标准在那里不需要任何东西,因此 g++ 会出错,甚至 gcc(编译为 C)也会产生警告:

H:\dev\tools\better keyboard\test> gcc com_server\com_server_i.c -c
com_server\com_server_i.c:68:8:警告:#endif 指令末尾的额外标记
 #endif !_MIDL_USE_GUIDDEF_
        ^

H:\dev\tools\更好的键盘\测试>_

每次生成该代码时手动修复该代码会变得烦人且烦人。

假设 gcc 必须编译代码,是否有更好的方法来避免这个明显未命名的警告?

我已经大致查看了一个关于此的现有问题,但无济于事。

4

1 回答 1

3

将评论转换为答案。

最简单的机制可能是对生成的代码进行后处理:

sed -i.bak -e 's/^#endif .*/#endif/' com_server/com_server_i.c

或同等学历。或者您可以在之后保留材料,#endif但在此处发表评论:

sed -i.bak -e 's%^#endif \(.*\)%#endif // \1%' com_server/com_server_i.c

如果您使用的是makefile,则在调用 MIDL 编译器之后将后处理添加为额外操作非常容易。

交叉引用的问题不会有帮助。!不能通过宏定义删除。实际上,#endif即使宏扩展为空,在之后出现宏也会引发警告。

您是否检查了 MIDL 编译器的 Microsoft 错误报告(查看这是否是他们拒绝修复的已知问题)?您是否检查了 MIDL 编译器的选项以查看是否有任何可以解决此问题的方法?

于 2015-03-19T20:09:17.767 回答