重新定义类型包括NetInet/In.H和NetInet6/in6.h



我以该顺序包括Netinet/in.H和NetInet6/in6.h。这工作了几个月。现在,我遇到了一个编译器错误,即重新定义了6.h中的类型,因为In.h还包含in6.h。我检查了6.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
...

我不得直接包含它,我将其删除并解决了问题。但是为什么会发生呢?有一个警卫,但似乎没有起作用。我搜索了它,它从来没有不确定。那么为什么会出现这个问题呢?这可能取决于包含顺序,因为在其他不同的用例中,还不会发生此问题。但是再次:有一个警卫,它永远不会发生,不是吗?

标题文件由QNX提供。

警告告诉您确切需要知道的内容。与其阅读接口的文档,这清楚地表明,netinet/in.h是要获取IP的标题,包括IPv6,类型和宏定义,您包括了一些非标准的,可能的实现 - 内部,通过ls找到的标题,或通过从阅读示例中读取示例别人的代码错误。这些标头之间的接口没有设置为保证它可以起作用(即使它们是便携式的(,因此,不仅仅是让它独自一人,等待东西打破和用户投诉,有人修复了它以给您一个错误,所以您知道自己在做什么是错误的。

大概的机制是,在包含内部标头netinet6/in6.h之前,预计netinet/in.h会尽早定义宏_NETINET_IN_H_INCLUDED。因此,如果在netinet/in.h之前包含netinet6/in6.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的存在,如果未定义,则出错。

最新更新