映射_匿名与C99标准

映射_匿名与C99标准,c,posix,glibc,mmap,C,Posix,Glibc,Mmap,我有一个使用mmap系统调用的应用程序,我在编译它的过程中遇到了一个问题,我想知道为什么我得到了MAP_ANON和MAP_ANONYMOUS没有声明,我使用了一小段代码,我发现我可以很好地编译它,所以我尝试了一个基本的编译,结果成功了,我看到当您添加-std=c99时它失败了。MAP_ANON和MAP_ANONYMOUS在C99标准中无效是否有具体原因?我知道它们不是由POSIX定义的,而是由BSD源代码定义的,所以我只想知道为什么是这样。您可能想要-std=gnu99而不是-std=c99。C

我有一个使用mmap系统调用的应用程序,我在编译它的过程中遇到了一个问题,我想知道为什么我得到了MAP_ANON和MAP_ANONYMOUS没有声明,我使用了一小段代码,我发现我可以很好地编译它,所以我尝试了一个基本的编译,结果成功了,我看到当您添加-std=c99时它失败了。MAP_ANON和MAP_ANONYMOUS在C99标准中无效是否有具体原因?我知道它们不是由POSIX定义的,而是由BSD源代码定义的,所以我只想知道为什么是这样。

您可能想要
-std=gnu99
而不是
-std=c99
。C99模式显式禁用(大多数)GNU扩展

我写了一个简单的测试:

#include <sys/mman.h>

int a = MAP_ANONYMOUS;
而在Gnu99模式下,它会:

$ gcc -std=gnu99 -c d.c

如果您不想要任何C语言的GNU扩展,您可以将
#define(定义)GNU(源代码)
放在所有
(首先是
)中
包含在需要C99以外的东西的文件中。@Zack:或者
(BSD)源代码
,这取决于您希望代码移植到的位置。还是我在这里越位了?扎克有正确的答案。这与C语言无关,但具有用于扩展库函数的正确功能测试宏。
\u GNU\u SOURCE
是实现它的平台(即glibc)上的
\u BSD\u SOURCE
的超集。您将需要为实际的BSD派生Unix定义其他内容,并为您实际关心的每个剩余的专有变体定义其他内容。不幸的是,你不能仅仅定义所有的宏并完成它们,因为有些系统认为它们知道其他系统的
*\u SOURCE
宏的意思,通常它们是错误的;你必须弄清楚你所拥有的系统,不包括任何系统标题,只定义适当的一个。还考虑使用<代码> SmithOntOpen/<代码>,它达到了类似的效果,但是是POSIX。遗憾的是,代码> SmithOnguts<代码>比“代码> MMAP”有更多的警告。由于其不可移植的名称论点,它在实践中可能不再是任何标准。
$ gcc -std=gnu99 -c d.c