-D_XOPEN_SOURCE是什么意思?


103

我最近遇到了一些代码,如果没有此arg,gcc将无法编译这些代码。我检查了gcc手册页,但没有找到此特定选项。我确实找到了XOPEN_SOURCE,但是对其作用的解释很少。

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

Answers:


132

当你做

#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或使用新的功能,因为有时候他们的行为取决于哪些选项的变化和#define你得了,例如与基名(3)

也可以看看:


4
只是为了强调“在源文件的顶部”对于这些语言方言定义的重要性。如果它们不在最顶端,则它们将无法工作。
Dr Person Person II

6

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

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

有时必须定义其中之一,因为某些标准功能的行为甚至其签名在不同标准之间可能会有所不同。因此,您可能必须使用-D_XOPEN_SOURCE或类似方式才能打开兼容模式。

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


3

这样就可以将标头公开为属于给定规范的定义,例如posix。它所属的实际范数由值(例如此处为400或600)定义。有关规范/值绑定,请参见此参考


1

由于某些未知的原因,Mac OS / X(XCode)需要600才能定义strdup(),即使它在1995年的规范中也是如此。Mozilla和其他人遇到了这个问题...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.