gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:40:11 26 4
gpt4 key购买 nike

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\better keyboard\test>gcc com_server\com_server_i.c -ccom_server\com_server_i.c:68:8: warning: extra tokens at end of #endif directive #endif !_MIDL_USE_GUIDDEF_        ^H:\dev\tools\better keyboard\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 编译器的选项以查看是否有任何可以解决此问题的方法?

关于c++ - 在预处理指令后避免对(生成的) token 发出 gcc 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29153518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com