我最近遇到了一些代码,如果没有这个arg,gcc就无法编译.我检查了gcc手册页,但没有找到这个特定的选项.我找到了XOPEN_SOURCE
,但几乎没有解释它的作用.
有人可以详细说明吗?我知道-D_XOPEN_SOURCE
可以设置为不同的值,这样400
,600
但什么的呢?
Mik*_*kel 120
当你这样做
#define _XOPEN_SOURCE <some number>
Run Code Online (Sandbox Code Playgroud)
要么
cc -D_XOPEN_SOURCE=<some number>
Run Code Online (Sandbox Code Playgroud)
它告诉编译器包含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
Run Code Online (Sandbox Code Playgroud)
这意味着你应该把其中一个:
#define _SVID_SOURCE
#define _BSD_SOURCE
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
Run Code Online (Sandbox Code Playgroud)
#include
如果要使用,请在执行任何s 之前在源文件的顶部strdup
.
或者你可以把
#define _GNU_SOURCE
Run Code Online (Sandbox Code Playgroud)
相反,它启用了所有功能,但缺点是它可能无法在Solaris,FreeBSD,Mac OS X等上编译.
这是一个好主意,做前要检查每一个人网页#include
,#define
或使用新的功能,因为有时候他们的行为取决于哪些选项的变化和#define
你得了,例如与基名(3) .
也可以看看:
-D
是ac编译器选项,用于定义预处理器变量.在这种情况下_XOPEN_SOURCE
.
这实际上并不影响编译器本身的行为,而是改变某些库(例如标准c库)的行为方式.有这样的几种选择.在大多数情况下,它们与某些特定于UNIX的编程接口或某些特定库供应商的标准文档有关.
有时需要定义其中一个,因为某些标准函数的行为甚至它们的签名在标准之间可能不同.因此,您可能必须使用-D_XOPEN_SOURCE
或类似的东西打开兼容模式.
这些标志的另一种可能用法是通过转换C库实现提供的扩展来确保源代码保持在某个标准的限制范围内.这是您可以用来确保代码在尽可能多的平台上运行的措施之一.
归档时间: |
|
查看次数: |
38120 次 |
最近记录: |