在预处理指令后避免对(生成的)令牌发出 gcc 警告?

Avoid gcc warning for (generated) tokens after preprocessing directive?

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_

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

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

H:\dev\tools\better keyboard\test>_

每次生成该代码时手动修复该代码是一件令人厌烦和烦人的事情。

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

我看过一个 existing question roughly about this,但没有用。

正在将评论转化为答案。

最简单的机制可能是post-处理生成的代码:

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

或同等学历。或者您可以在 #endif 之后保留 material 但在此处添加注释:

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

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

交叉引用的问题不会轻易提供帮助; ! 无法通过宏定义删除。实际上,在 #endif 之后存在宏会引发警告,即使该宏扩展为空。

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