-D_XOPEN_SOURCE做什么/意味着什么?

时间:2011-03-21 14:11:24

标签: c gcc

我最近遇到了一些gcc在没有这个arg的情况下无法编译的代码。我检查了gcc手册页,但没有找到这个特定的选项。我找到了XOPEN_SOURCE,但几乎没有解释它的作用。

有人可以详细说明吗?我知道-D_XOPEN_SOURCE可以设置为不同的值,例如400600,但这些是做什么的?

4 个答案:

答案 0 :(得分:118)

当你这样做时

#define _XOPEN_SOURCE <some number>

cc -D_XOPEN_SOURCE=<some number>

它告诉编译器包含X / Open和POSIX标准中定义的一些额外函数的定义。

这将为您提供最新UNIX / BSD / Linux系统上存在的一些额外功能,但可能并不存在于其他系统(如Windows)上。

这些数字指的是标准的不同版本。

您可以通过查看所调用的每个功能的手册页来判断您需要哪一个(如果有)。

例如,man strdup说:

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       strdup(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500
       strndup(), strdupa(), strndupa(): _GNU_SOURCE

这意味着你应该把其中一个:

#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
如果您想使用#include,请在执行任何strdup之前在源文件的顶部

或者你可以把

#define _GNU_SOURCE
相反,它启用了所有功能,但缺点是它可能无法在Solaris,FreeBSD,Mac OS X等上编译。

在执行#include#define或使用新功能之前检查每个手册页是个好主意,因为有时他们的行为会根据选项和{{1}而变化你有,例如basename(3)

另见:

答案 1 :(得分:6)

-D是用于定义预处理器变量的c编译器选项。在这种情况下_XOPEN_SOURCE

这实际上不会影响编译器本身的行为,而是会改变某些库的行为,例如:标准的c库,表现得很好。有这样的几种选择。在大多数情况下,它们与某些特定于UNIX的编程接口或某些特定库供应商的标准文档有关。

有时需要定义其中一个,因为某些标准函数的行为甚至它们的签名在标准之间可能不同。因此,您可能必须使用-D_XOPEN_SOURCE或类似内容来启用兼容模式。

这些标志的另一种可能用法是通过转换C库实现提供的扩展来确保源代码保持在某个标准的限制范围内。这是您可以用来确保代码在尽可能多的平台上运行的措施之一。

答案 2 :(得分:3)

这会使标头公开属于给定范数的定义,例如posix。 它所属的实际规范由值定义(例如,此处为400或600)。 有关规范/值绑定,请参阅此Reference

答案 3 :(得分:0)

由于某些未知原因,Mac OS / X(XCode)需要600来定义strdup(),即使它是在1995规范中。 Mozilla和others遇到了这个......