gpt4 book ai didi

linux - 为什么 C99 提示存储大小?

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:38 26 4
gpt4 key购买 nike

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

最佳答案

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

首先,net/if.h:

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

所以:

  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 是未定义。

回到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 提供的功能之上启用所需的功能。

关于linux - 为什么 C99 提示存储大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25547604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com