为什么C99会抱怨存储容量?

时间:2012-05-03 14:57:19

标签: linux gcc network-programming c99 gnu99

这是我在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的定义?

1 个答案:

答案 0 :(得分:18)

这是预处理和GNU C与C99相关的一系列后果。

首先,net/if.h

  1. net/if.h包含features.h
  2. 稍后,它会在struct ifreq块中定义#ifdef __USE_MISC
  3. 所以:

    1. 什么是__USE_MISC? - 这是BSD和System V常见的东西
    2. 此时是否定义了? - 我们需要在features.h
    3. 中查看

      现在,features.h

      1. 使用--std=c99 GCC默认定义__STRICT_ANSI__(因为那就是C99)
      2. 在预处理features.h时,当__STRICT_ANSI__打开时,BSD和System V功能不会启动。即__USE_MISC未定义。
      3. 备份到net/if.hstruct 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提供的功能之上启用所需的功能。