MAP_ANONYMOUS符合C99标准

Jes*_*mos 20 c posix mmap glibc

我有一个使用mmap系统调用的应用程序,我有一个问题,让它编译几个小时,看看为什么我得到MAP_ANON和MAP_ANONYMOUS未声明,我有一个较小的代码部分,我用过,我看到我可以编译它就好了,所以我尝试了一个基本的编译,这工作,我看到它添加-std = c99失败.是否有特定原因导致MAP_ANON和MAP_ANONYMOUS在C99标准中无效?我知道它们不是由POSIX定义的,而是由BSD SOURCE定义的,所以我只想知道为什么会这样.

Con*_*yer 22

你可能想要-std=gnu99而不是-std=c99.C99模式明确禁用(大多数)GNU扩展.

我写了一个简单的测试:

#include <sys/mman.h>

int a = MAP_ANONYMOUS;
Run Code Online (Sandbox Code Playgroud)

在C99模式下,它找不到值:

$ gcc -std=c99 -c d.c
d.c:3:9: error: ‘MAP_ANONYMOUS’ undeclared here (not in a function)
Run Code Online (Sandbox Code Playgroud)

而在Gnu99模式中,它确实:

$ gcc -std=gnu99 -c d.c
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想要C*语言*的任何GNU扩展,你可以将`#define _GNU_SOURCE`放在所有`#include`s上面的文件中,这些文件需要一些不在C99中的东西. (14认同)
  • `_GNU_SOURCE`是实现它的平台上的`_BSD_SOURCE`的超集(即glibc).您需要为实际的BSD派生的Unix定义其他内容,并为您实际关注的每个剩余专有变体再定义一些其他内容.不幸的是,你不能只定义所有这些并完成,因为有些系统认为他们知道其他系统的'*_SOURCE`宏是什么意思,通常它们是错的; 你必须弄清楚你有哪个系统,*没有*包括任何系统头,并且只定义适当的系统头. (3认同)
  • 扎克有正确的答案.这不是关于C语言,而是具有用于扩展库函数的正确的功能测试宏. (2认同)