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 \更好的键盘\ test> gcc com_server \ com_server_i.c -c
com_server \ com_server_i.c:68:8:警告:#endif指令末尾的额外 token
#endif!_MIDL_USE_GUIDDEF_
^

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

每次生成代码时手动对其进行修复都是很烦人的事情。

假设gcc必须编译代码,是否有更好的方法来避免出现这种似乎未命名的警告?

我看了一个existing question roughly about this,但无济于事。

最佳答案

将评论转换为答案。

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

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

或同等学历。或者,您可以在#endif之后保留 Material ,但在此处添加注释:
sed -i.bak -e 's%^#endif \(.*\)%#endif // \1%' com_server/com_server_i.c

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

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

您是否检查了MIDL编译器的Microsoft错误报告(以查看它们拒绝解决的已知问题)?您是否检查了MIDL编译器的选项,看是否有什么可以解决此问题的?

10-08 15:33