【问题标题】:MAP_ANONYMOUS with C99 standardMAP_ANONYMOUS 符合 C99 标准
【发布时间】:2011-07-23 17:36:08
【问题描述】:

我有一个使用 mmap 系统调用的应用程序,我在编译几个小时后遇到问题,想知道为什么我得到 MAP_ANON 和 MAP_ANONYMOUS 未声明,我使用了一小段代码,我看到我可以很好地编译它,所以我尝试了一个基本的编译并且有效,我看到当你添加 -std=c99 时它失败了。是否存在 MAP_ANON 和 MAP_ANONYMOUS 在 C99 标准中无效的特定原因?我知道它们不是由 POSIX 定义的,而是由 BSD SOURCE 定义的,所以我只想知道为什么会这样。

【问题讨论】:

  • 也可以考虑使用shm_open,可以达到类似的效果,但是是POSIX。
  • 不幸的是,shm_openmmap 有更多的注意事项,并且由于其不可移植的 name 参数,它在实践中可能不再是标准。

标签: c posix glibc mmap


【解决方案1】:

您可能想要-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

【讨论】:

  • 如果您不想要 C 语言 的任何 GNU 扩展,您可以将#define _GNU_SOURCE 放在最重要的#includes 文件中需要一些东西这不在 C99 中。
  • @Zack:或_BSD_SOURCE,我想这取决于您希望代码可移植到的位置。或者我是不是在这里?
  • 扎克有正确的答案。这与 C 方言无关,而是为扩展库函数提供了正确的功能测试宏。
  • _GNU_SOURCE_BSD_SOURCE 在实现它的平台上的超集(即glibc)。您需要为实际的 BSD 派生 Unix 定义其他内容,并为您真正关心的每个剩余专有变体再次定义其他内容。不幸的是,您不能只定义所有这些并完成,因为有些系统认为他们知道其他系统的*_SOURCE 宏的含义,而且通常他们是错误的;您必须弄清楚您拥有的是哪个系统,不包括任何系统标头,并且只定义适当的系统标头。
猜你喜欢
  • 2014-04-12
  • 2013-08-27
  • 2011-01-19
  • 2017-11-09
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多