-D_XOPEN_SOURCE是什么意思?

vhmi4jdf  于 2023-04-29  发布在  其他
关注(0)|答案(4)|浏览(225)

我最近遇到了一些代码,如果没有这个参数,GCC就无法编译。我检查了gcc手册页,但没有找到这个特定的选项。我确实找到了XOPEN_SOURCE,但几乎没有解释它的作用。
有人能详细解释一下吗?我知道-D_XOPEN_SOURCE可以设置为不同的值,例如400600,但它们有什么作用?

3hvapo4f

3hvapo4f1#

等你找到了

#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

如果你想使用strdup,在执行任何#include操作之前,在你的源文件的顶部。
或者你可以把

#define _GNU_SOURCE

它启用了所有功能,但缺点是它可能无法在Solaris、FreeBSD、Mac OS X等上编译。
在执行#include#define或使用新函数之前,最好检查每个手册页,因为有时它们的行为会根据您拥有的选项和#define而变化,例如使用basename(3)
参见:

ht4b089n

ht4b089n2#

-D是一个c编译器选项,用于定义预处理器变量。在这个例子中,_XOPEN_SOURCE
这实际上并不影响编译器本身的行为,而是改变了一些库,例如。g.标准c库,行为。有几个这样的选择。在大多数情况下,它们与一些关于UNIX特定编程接口或特定库供应商的标准文档有关。
定义其中一个函数有时是必要的,因为一些标准函数的行为甚至它们的签名在不同的标准之间可能会有所不同。因此,您可能必须使用-D_XOPEN_SOURCE或类似的东西来打开兼容模式。
这些标志的另一种可能的用法是通过转换C库实现提供的扩展来确保源代码保持在特定标准的限制之内。这是您可以用来确保代码在尽可能多的平台上运行的措施之一。

aamkag61

aamkag613#

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

eimct9ow

eimct9ow4#

由于一些未知的原因,Mac OS/X(XCode)需要600个来定义strdup(),尽管它是在1995年的规范中。Mozilla和others就遇到了这种情况。..

相关问题