Linux 为什么C99会抱怨存储大小?

Linux 为什么C99会抱怨存储大小?,linux,gcc,network-programming,c99,gnu99,Linux,Gcc,Network Programming,C99,Gnu99,这是我在Linux上编译的一些代码: #include <net/if.h> int main() { struct ifreq ifr; } C99有什么不同之处,它不喜欢Linux中的struct ifreq的定义?这是预处理和GNU C与C99的一系列结果 首先,net/if.h: net/if.h包括功能.h 稍后,它在#ifdef_uuuuse_umisc块中定义struct ifreq 因此: 什么是\u USE\u MISC这是BSD和SystemV的共同点 在

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

#include <net/if.h>

int main() {
  struct ifreq ifr;
}

C99有什么不同之处,它不喜欢Linux中的
struct ifreq
的定义?

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

首先,
net/if.h

  • net/if.h
    包括
    功能.h
  • 稍后,它在
    #ifdef_uuuuse_umisc
    块中定义
    struct ifreq
  • 因此:

  • 什么是
    \u USE\u MISC
    这是BSD和SystemV的共同点
  • 在这一点上有定义吗?--我们需要在
    features.h
  • 现在,
    features.h

  • 当您使用
    --std=c99
    时,默认情况下,GCC定义了
    \uuuu STRICT\uu ANSI\uuuuu
    (因为这就是c99)
  • 在预处理
    features.h
    时,当
    \uuuuu STRICT\u ANSI\uuuu
    打开时,BSD和System V功能不会启动。i、 e.
    \u USE\u MISC
    未定义
  • 备份到
    net/if.h
    struct ifreq
    在预处理后甚至不存在因此,有关存储容量的投诉

    您可以通过以下操作了解整个故事:

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

    vimdiff我相信我的问题是重复的:谢谢你的解释。我只是偶然发现了完全相同的问题。有没有办法用
    --std=c99
    成功编译这样的代码?@michas Yes。您可以在C源代码中定义
    \u BSD\u源代码
    \u SVID\u源代码
    vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)