Apple's man page for getifaddrs
says, under "BUGS",
If both <net/if.h> and <ifaddrs.h> are being included, <net/if.h> must be included before <ifaddrs.h>.
Why is this? This looks to be an Apple thing as there's no such caveat in the Linux man page.
Apple's ifaddrs.h (at least, on my machine) contains this section:
/*
* 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
However, my net/if.h doesn't define ifa_broadaddr
so it's not clear what the conflict would be.
<net/if.h>
includes <net/if_var.h>
:
#include <net/if_var.h>
And <net/if_var.h>
defines it:
#define ifa_broadaddr ifa_dstaddr /* broadcast address interface */
Note that this definition is always (re)defined in <net/if_var.h>
.
The definition in <ifaddrs.h>
is surrounded by #ifndef
and #endif
tags to prevent redefinition, which means it can use an alternative definition if it was already defined.
From the very same documentation you linked:
Note that as a convenience,
ifa_broadaddr
is defined by a compiler #define directive to be the same asifa_dstaddr
.
By including <net/if.h>
(and thus also <net/if_var.h>
) before <ifaddrs.h>
, you ensure the definition of ifa_broadaddr
matches.