-D_XOPEN_SOURCE做什么/意思?
我最近遇到了一些gcc在没有这个arg的情况下不能编译的代码。 我检查了gcc手册页,但没有find这个特定的选项。 我确实find了XOPEN_SOURCE
,但是它没有什么解释。
有人可以详细说明吗? 我知道-D_XOPEN_SOURCE
可以设置为不同的值,比如-D_XOPEN_SOURCE
,但是这些都是干什么的?
当你这样做
#define _XOPEN_SOURCE <some number>
要么
cc -D_XOPEN_SOURCE=<some number>
它会告诉您的编译器包含一些在X / Open和POSIX标准中定义的额外函数的定义。
这会给你一些额外的function,在最新的UNIX / BSD / Linux系统上存在,但可能不存在于其他系统,如Windows。
数字指的是不同版本的标准。
- 500 – X / Open 5,包含POSIX 1995
- 600 – X / Open 6,并入POSIX 2004
- 700 – X / Open 7,并入POSIX 2008
您可以通过查看您所调用的每个函数的手册页来确定您需要哪一个(如果有的话)。
例如, 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
在那里,所有的function,其缺点是它可能无法在Solaris,FreeBSD,Mac OS X等编译。
在执行#include
, #include
#define
或使用新函数之前,检查每个手册页是一个好主意,因为有时它们的行为会根据您拥有的选项和#define
更改,例如使用basename(3) 。
也可以看看:
- Linux:与-std = c99的gcc抱怨不知道struct timespec
- glibcfunctiontestingmacros
- 编译环境 – Open Group Base Specification issue 6(又名X / Open 6)
- POSIX – 维基百科
- 单一UNIX规范 – 维基百科
-D
是用于定义预处理器variables的交stream编译器选项。 在这种情况下_XOPEN_SOURCE
。
这实际上并不影响编译器本身的行为,而是改变了一些库(例如标准c库)的行为方式。 有几个这样的选项。 在大多数情况下,它们与某些有关UNIX特定编程接口的标准文档或某些特定的库供应商有关。
定义其中的一个有时是必要的,因为一些标准函数的行为,甚至是他们的签名在标准之间可能不同。 所以你可能不得不使用-D_XOPEN_SOURCE
或类似的东西来打开一个兼容模式。
这些标志的另一种可能用法是通过转换C库实现提供的扩展来确保源代码保持在特定标准的范围内。 这是您可以用来确保您的代码在尽可能多的平台上运行的措施之一。
这暴露了标题属于一个给定的规范,如posix的定义。 它所属的实际规范是由值(在这里是400或600)定义的。 请参阅此参考以了解规范/值绑定。
由于一些未知的原因,Mac OS / X(XCode)需要600来定义strdup(),尽pipe它在1995年的规范中。 Mozilla和其他人已经遇到了这个…