为何需先引入<net/if.h>再引入<ifaddrs.h>?
问题
Apple平台的getifaddrs手册页在“BUGS”章节中提到:
若同时引入
<net/if.h>和<ifaddrs.h>,必须先引入<net/if.h>。
为何会有这样的要求?这似乎是Apple平台特有的规则,因为Linux的getifaddrs手册页中并无此类提示。Apple的ifaddrs.h(至少在我的设备上)包含以下代码段:
/* * This may have been defined in <net/if.h>. Note that if <net/if.h> is * to be included it must be included before this header file. */ #ifndef ifa_broadaddr #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ #endif
不过,我的net/if.h并未定义ifa_broadaddr,因此不清楚可能存在的冲突点是什么。
回答
这个要求本质是为了避免宏定义的冲突或不一致,哪怕你当前设备的net/if.h没定义ifa_broadaddr,但Apple平台的历史版本或其他兼容场景下,net/if.h可能曾经定义过这个宏,或者未来版本有添加该定义的可能。
从ifaddrs.h里的注释和代码能看出门道:
- 代码通过
#ifndef ifa_broadaddr做判断,如果<net/if.h>已经定义了ifa_broadaddr,就不会重复定义; - 要是先引入
ifaddrs.h,它会先把ifa_broadaddr定义成ifa_dstaddr的别名,之后再引入<net/if.h>时,如果<net/if.h>里有自己的ifa_broadaddr定义,就会触发重复定义的编译错误。
虽然现在你的环境里<net/if.h>没有这个宏,但Apple的手册页是面向全平台场景的,要兼顾不同版本、不同设备的兼容性,所以才强制要求这个引入顺序——确保<net/if.h>的宏定义优先级更高,避免后续可能出现的冲突。
Linux平台没有这个要求,是因为它的头文件设计中,<ifaddrs.h>和<net/if.h>之间不存在这种宏定义重叠的情况,或者Linux用了其他方式规避了这类问题。
内容的提问来源于stack exchange,提问作者Daniel Walker
相关产品推荐
相关产品推荐

