打开_GNU_SOURCE这个宏可以打开一些功能,比如为了在Linux系统上编译使用带有检测文件type的宏(S_ISxxxx):
S_ISREG() //传入stat结构的st_mode,下同。是否为普通文件
S_ISDIR() //是否为目录
S_ISLNK() //是否为符号链接
S_ISSOCK() //是否为套接字
这样子就能包含了上述宏的定义。
在编写网络程序时,会涉及到一些关于BSD系统保留下的结构体和宏定义,关于一切配置在linux系统的/usr/include/features.h文件中,开启项如下:
#ifdef _GNU_SOURCE
# undef _ISOC99_SOURCE
# define _ISOC99_SOURCE
1
#
undef _POSIX_SOURCE
# define _POSIX_SOURCE 1
#
undef
_POSIX_C_SOURCE
# define
_POSIX_C_SOURCE 199506L
#
undef
_XOPEN_SOURCE
# define _XOPEN_SOURCE 600
#
undef
_XOPEN_SOURCE_EXTENDED
# define _XOPEN_SOURCE_EXTENDED 1
#
undef
_LARGEFILE64_SOURCE
# define
_LARGEFILE64_SOURCE 1
# undef
_BSD_SOURCE
#
define _BSD_SOURCE 1
# undef _SVID_SOURCE
# define
_SVID_SOURCE 1
#endif
可以看出只要开启了_GNU_SOURCE的花,大部分的BSD功能可以打开,看看_GNU_SOURCE是否开启有一个测试程序:
#include <iostream>
int main() {
#ifdef _GNU_SOURCE
std::cout << "gnu/n";
#else
std::cout << "non-gnu/n";
#endif
}
只要gcc -D _GNU_SOURCE test.c -o test.o编译生成的text.o文件,运行一下就知道是否开启了