我最近遇到了一些gcc在没有这个arg的情况下无法编译的代码。我检查了gcc手册页,但没有找到这个特定的选项。我找到了XOPEN_SOURCE
,但几乎没有解释它的作用。
有人可以详细说明吗?我知道-D_XOPEN_SOURCE
可以设置为不同的值,例如400
,600
,但这些是做什么的?
答案 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遇到了这个......