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

Jim*_*ker 11 linux gcc network-programming c99 gnu99

这是我在Linux上编译的一些代码:

#include <net/if.h>

int main() {
  struct ifreq ifr;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

与C99有什么不同,它不喜欢struct ifreqLinux中的定义?

Arj*_*kar 18

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

首先,net/if.h:

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

所以:

  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.h:struct ifreq预处理后甚至不存在!因此,关于存储大小的投诉.

您可以通过以下方式捕捉整个故事:

vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)
Run Code Online (Sandbox Code Playgroud)

或者以任何其他方式(比如diff --side-by-side)代替它来区分它们vimdiff.

如果你想要干净利地编译它-std=c99,你必须考虑包含_DEFAULT_SOURCE功能测试宏(对于glibc版本> = 2.19;对于较旧的glibc版本,使用_BSD_SOURCE或者_SVID_SOURCE),以便在所提供的功能之上启用所需的功能. C99.