2011-03-21 492 views
80

我最近遇到了一些代码,gcc不会在没有这个参数的情况下编译。我检查了gcc手册页,但没有找到这个特定的选项。我确实发现了XOPEN_SOURCE,但是它没有什么解释。-D_XOPEN_SOURCE做什么/意思?

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

回答

105

当你

#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而变化,例如basename(3)

参见:

+1

只是一个评论,强调“在你的源文件的顶部”是多么重要的是这些语言方言定义。如果他们不在最顶层,他们就不起作用。 – 2016-01-04 19:45:21

3

这暴露头属于一个给定的规范,如posix的定义。 它所属的实际标准是由值(例如400或600)定义的。 请参阅Reference以了解标准/值的绑定。

7

-D是定义预处理器变量的c编译器选项。在这种情况下_XOPEN_SOURCE

这实际上并不影响编译器本身的行为,而是改变了一些库的使用方式,例如,标准c库,表现得很好。有几个这样的选项。在大多数情况下,它们与某些有关UNIX特定编程接口的标准文档或某些特定的库供应商有关。

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

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

0

对于一些未知reaso n,Mac OS/X(XCode)需要600来定义strdup(),尽管它在1995年的规范中。 Mozilla和others已经遇到了这个......