-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和其他人已经遇到了这个…