为什么C99抱怨存储大小?

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

Solutions Collecting From Web of "为什么C99抱怨存储大小?"

这是预处理和GNU C与C99的后果链。

首先, net/if.h

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

所以:

  1. 什么是__USE_MISC ? – 这是BSD和System V共同的东西
  2. 这个定义吗? – 我们需要在features.h检查

所以现在, features.h

  1. 当你使用--std=c99默认情况下,GCC定义了__STRICT_ANSI__ (因为那是什么C99)
  2. 在预处理features.h ,当__STRICT_ANSI__打开的时候,BSD和System V特性不会被踢入,即__USE_MISC被定义。

备份到net/if.hstruct ifreq在预处理后不存在! 因此,关于存储大小的投诉

你可以通过这样做来理解整个故事:

 vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD) 

或以任何其他方式(如diff --side-by-side )而不是vimdiff来区分它们。