gpt4 book ai didi

c++ - 包含 netinet/in.h 和 netinet6/in6.h 时重新定义类型

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:31 26 4
gpt4 key购买 nike

我按顺序包含了 netinet/in.h 和 netinet6/in6.h。这工作了几个月。现在我得到一个编译器错误,in6.h 中的类型被重新定义,因为 in.h 还包括 in6.h。我检查了 in6.h,它开始于:

#ifndef _NETINET_IN_H_INCLUDED
#error "do not include netinet6/in6.h directly, include netinet/in.h. see RFC2553"
#endif

#ifndef _NETINET6_IN6_H_INCLUDED
#define _NETINET6_IN6_H_INCLUDED
...

肯定不是我直接include了,我去掉了,问题就解决了。但是为什么会发生呢?有一个守卫,但似乎不起作用。我搜索了它,它永远不会未定义。那么为什么会出现这个问题呢?它可能取决于包含顺序,因为在具有不同包含的其他用例中不会发生此问题。但同样:有一个守卫,它永远不应该发生,不是吗?

头文件由 QNX 提供。

最佳答案

该警告准确地告诉您您需要知道的内容。与其阅读接口(interface)文档,很明显 netinet/in.h 是获取 IP 的 header ,包括 IPv6、类型和宏定义,您还包括了一些非标准的、可能的实现-内部,通过 ls 或通过阅读其他人的错误代码中的示例找到的 header 。这些 header 之间的接口(interface)未设置为保证它可以工作(即使它们可以工作,它也不可移植),所以与其让它独自一人并等待出现问题和用户提示,不如有人修复它给你一个错误,让您知道自己在做什么是错误的。

大概这里的机制是 netinet/in.h 应该在包含内部 header netinet6/in6 之前的某个地方尽早定义宏 _NETINET_IN_H_INCLUDED .h。因此,如果 netinet6/in6.hnetinet/in.h 之前包含,则会产生错误,但如果它包含在 netinet/in.hnetinet/in.h 之后,跳过 #error 指令。

由于这仍然允许根据顺序错误使用,更好的方法是,来自 netinet/in.h:

#define _INCLUDING_NETINET_IN_H
#include <netinet6/in6.h>
#undef _INCLUDING_NETINET_IN_H

并让 netinet6/in6.h 检查 _INCLUDING_NETINET_IN_H 是否存在,如果未定义则出错。

关于c++ - 包含 netinet/in.h 和 netinet6/in6.h 时重新定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57327747/

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