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编译器的选项,看是否有什么可以解决此问题的?