这是预处理和 GNU C 与 C99 的一系列后果。
首先,net/if.h:
net/if.h包括features.h
- 稍后,它
struct ifreq在#ifdef __USE_MISC块内定义。
所以:
- 是什么
__USE_MISC?-- 这是 BSD 和 System V 共有的东西
- 在这一点上定义了吗?-- 我们需要检查一下
features.h
所以现在,features.h:
- 默认情况下使用
--std=c99GCC 时定义__STRICT_ANSI__(因为这就是 C99)
- 在 preprocessing
features.h时,当__STRICT_ANSI__打开时,BSD 和 System V 功能不会启动。即__USE_MISC未定义。
备份到net/if.h:struct ifreq预处理后甚至不存在!因此,关于存储大小的抱怨。
您可以通过以下方式了解整个故事:
vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)
或以任何其他方式(如diff --side-by-side)而不是vimdiff.
如果您希望使用 进行干净编译-std=c99,则必须考虑包含_DEFAULT_SOURCE功能测试宏(对于 glibc 版本 >= 2.19;对于较旧的 glibc 版本,请使用_BSD_SOURCE或_SVID_SOURCE),以便在提供的功能之上启用所需的功能C99。