14

这是我在 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 有什么不同之处在于它不喜欢struct ifreqLinux 中的定义?

4

1 回答 1

22

这是预处理和 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=c99GCC 时定义__STRICT_ANSI__(因为这就是 C99)
  2. 在 preprocessingfeatures.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.

如果您希望使用 进行干净编译-std=c99,则必须考虑包含_DEFAULT_SOURCE功能测试宏(对于 glibc 版本 >= 2.19;对于较旧的 glibc 版本,请使用_BSD_SOURCE_SVID_SOURCE),以便在提供的功能之上启用所需的功能C99。

于 2012-05-03T16:50:00.287 回答