我知道这是一个传递到函数中的宏。你能否解释一下这个宏的用途以及在什么情况下我需要使用它?
_GNU_SOURCE
启用了GNU C库支持的C和操作系统标准的GNU扩展,如asprintf
。如果使用这样的非标准函数和宏,请定义它。
来自glibc
手册:
宏:_GNU_SOURCE
如果您定义了此宏,将包括所有内容:ISO C89、ISO C99、POSIX.1、POSIX.2、BSD、SVID、X/Open、LFS 和 GNU 扩展。在 POSIX.1 与 BSD 冲突的情况下,POSIX 定义优先。
http://www.gnu.org/software/libc/manual/html_node/Feature-Test-Macros.html
如果您的应用程序符合POSIX.1-(IEEE 1003.1-2008,ISO/IEC 9945:2009)和/或Single Unix Specification 2008(ISO/IEC 9945:2009 with X/Open Curses),则可以确保应用程序的可移植性。使用_GNU_SOURCE
将很可能限制源代码仅适用于GNU/Linux和GNU/Hurd系统,除非进行额外的工作以解决在其他平台上的不可移植性。
一些公司和政府/军事合同可能需要使用特定的平台标准。
如果您正在开发希望在多个Unix和类Unix系统(包括具有可用POSIX兼容性的Microsoft Windows NT、2000及更高版本)上提供的开源/免费软件应用程序,则将开发限制为POSIX.1库函数会使此任务更加容易。其他目标包括自由/开放BSD平台NetBSD、FreeBSD、OpenBSD、DragonflyBSD,以及商业Unix系统(Solaris、AIX、HP/UX等),这些系统不包括_GNU_SOURCE
功能。
如果您使用可移植函数的修改功能,我无法想到一个例子,但我相信这种情况确实存在,在非GNU平台上可能会产生微妙的错误。
因此,一般来说,如果您的开发已经锁定在GNU/Linux和GNU/Hurd上,则可以自由使用此类扩展,但是避免在可能部署在其他Unix和类Unix操作系统上的任何应用程序中使用此类扩展。
我正在处理一个从另外两个Unix平台移植到Linux的大型代码库,我们谨慎地使用_GNU_SOURCE
扩展,尽管大部分开发仅限于现代POSIX或IEEE 1003.1 / Single Unix Spec和C99(标准C库)标准以实现未来的兼容性。
gcc -v
检查您的版本,使用cpp -dM </dev/null
查找预定义头文件。_GNU_SOURCE未定义,因此,正如gcc手册所解释的那样,默认情况下允许不与ANSI/ISO标准冲突的扩展。_GNU_SOURCE还将允许修改或与ANSI/ISO标准冲突的GNU扩展。 - mctylr标准未规定的某些函数在库中提供,但仅在定义了某些特性测试宏时才可用。 _GNU_SOURCE
是使这些函数可用的宏之一。