这是我在Linux上编译的一些代码:
#include <net/if.h>
int main() {
struct ifreq ifr;
}
gcc test.c
没问题。
gcc -std=gnu99 test.c
没问题。
gcc -std=c99 test.c
因以下错误而失败:
test.c: In function ‘main’:
test.c:4:16: error: storage size of ‘ifr’ isn’t known
C99有什么不同,它不喜欢Linux中struct ifreq
的定义?
答案 0 :(得分:18)
这是预处理和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)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版本&gt; = 2.19;对于较旧的glibc版本,请使用_BSD_SOURCE
1}}或_SVID_SOURCE
),以便在C99提供的功能之上启用所需的功能。