D_XOPEN_SOURCE 是什么意思?

我最近遇到了一些代码,如果没有这个参数,gcc 将无法编译它们。我检查了 gcc 手册页,但没有找到这个特定的选项。我确实找到了 XOPEN_SOURCE,但是对于它的功能几乎没有任何解释。

有人能解释一下吗?我知道可以将 -D_XOPEN_SOURCE设置为不同的值,比如 400600,但是这些值有什么作用呢?

51941 次浏览

这会将头暴露为属于给定规范的定义,例如 posx。 它所属的实际范数由值定义(例如,这里是400或600)。 See this 参考文献 for the norm/value binding.

-D是一个 c 编译器选项,用于定义预处理器变量。

这实际上并不影响编译器本身的行为,而是改变了一些库的行为,比如标准的 c 库。有几种类似的选择。在大多数情况下,它们与某些关于某些 UNIX 特定编程接口的标准文档或某些特定库供应商有关。

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

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

等你找到的时候

#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

如果您想使用 strdup,在执行任何 #include之前,请在源文件的顶部放置。

或者你可以把

#define _GNU_SOURCE

相反,它支持所有功能,但缺点是它可能无法在 Solaris、 FreeBSD、 Mac OS X 等平台上编译。

在执行 #include#define或使用新函数之前检查每个手册页是一个好主意,因为有时它们的行为会根据您拥有的选项和 #define而改变,例如使用 基名(3)

参见:

由于某些未知的原因,Mac OS/X (XCode)需要600来定义 strup () ,尽管它是在1995年的规范中定义的。Mozilla 和 其他人遇到了这个..。