在预处理指令后避免对(生成的)令牌发出 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 编译器的选项以查看是否有任何可以解决此问题的方法?
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 编译器的选项以查看是否有任何可以解决此问题的方法?