【问题标题】:Why does C99 complain about storage sizes?为什么 C99 抱怨存储大小?
【发布时间】:2012-05-13 02:55:16
【问题描述】:

这是我在 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 的定义有什么不同?

【问题讨论】:

标签: linux gcc network-programming c99 gnu99


【解决方案1】:

这是预处理和 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.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 版本 >= 2.19;对于较旧的 glibc 版本,请使用 _BSD_SOURCE_SVID_SOURCE ) 以便在 C99 提供的功能之上启用所需的功能。

【讨论】:

  • 感谢您的解释。我只是偶然发现了完全相同的问题。有没有办法用--std=c99成功编译这样的代码?
  • @michas 是的。您可以在 C 源代码中定义 _BSD_SOURCE_SVID_SOURCE feature test macro
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 2015-06-09
  • 2020-08-12
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
相关资源
最近更新 更多