C99标准下的MAP_ANONYMOUS是什么?

22

我有一个使用mmap系统调用的应用程序,我花了几个小时来解决编译问题,查看为什么会出现MAP_ANON和MAP_ANONYMOUS未定义的情况。我使用了一小段代码,并发现可以正常编译,所以我尝试进行基本编译,这也成功了。但是当我加上 "-std=c99"时,它就失败了。C99标准中特意没有将MAP_ANON和MAP_ANONYMOUS定义为有效的内容,这是有原因的吗?我知道它们没有被POSIX定义,但却在BSD SOURCE中定义,我只是想知道其中的原因。


还可以考虑使用shm_open,它可以实现类似的效果,但是符合POSIX标准。 - Ciro Santilli OurBigBook.com
1
不幸的是,shm_openmmap 有更多的注意事项,由于其不可移植的 name 参数,在实践中它可能并不更加标准化。 - Lassi
1个回答

26

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

我写了一个简单的测试:

#include <sys/mman.h>

int a = MAP_ANONYMOUS;

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

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

在Gnu99模式下,它会执行:

$ gcc -std=gnu99 -c d.c

20
如果您不想使用GNU扩展功能来编写C语言代码,您可以在需要使用C99标准之外的功能的文件中,在所有的#include语句之前加上#define _GNU_SOURCE。请注意,这样做不会改变原始代码的含义。 - zwol
@Zack:或者,根据您希望代码可移植到哪里,使用_BSD_SOURCE。我想知道我是否离题了? - Conrad Meyer
4
Zack有正确的答案。这不是关于C语言方言,而是关于为扩展库函数拥有正确的特性测试宏。 - R.. GitHub STOP HELPING ICE
6
在那些实现了_GNU_SOURCE的平台(如glibc)上,它是_BSD_SOURCE的超集。对于真正的BSD衍生Unix,您需要定义其他内容,并且对于每个您真正关心的专有变体,都需要再定义其他内容。不幸的是,您不能仅仅定义所有这些并完成,因为一些系统认为它们知道其他系统的*_SOURCE宏的含义,通常它们是错误的;您需要找出您所拥有的系统类型,而不包含任何系统头文件,并且只定义适当的那一个。 - zwol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接