这是预处理和 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=c99
GCC 时定义__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。