我有一个使用mmap系统调用的应用程序,我花了几个小时来解决编译问题,查看为什么会出现MAP_ANON和MAP_ANONYMOUS未定义的情况。我使用了一小段代码,并发现可以正常编译,所以我尝试进行基本编译,这也成功了。但是当我加上 "-std=c99"时,它就失败了。C99标准中特意没有将MAP_ANON和MAP_ANONYMOUS定义为有效的内容,这是有原因的吗?我知道它们没有被POSIX定义,但却在BSD SOURCE中定义,我只是想知道其中的原因。
你可能需要使用-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
#include
语句之前加上#define _GNU_SOURCE
。请注意,这样做不会改变原始代码的含义。 - zwol_BSD_SOURCE
。我想知道我是否离题了? - Conrad Meyer
shm_open
,它可以实现类似的效果,但是符合POSIX标准。 - Ciro Santilli OurBigBook.comshm_open
比mmap
有更多的注意事项,由于其不可移植的 name 参数,在实践中它可能并不更加标准化。 - Lassi