关于_GNU_SOURCE宏

是在features.h中用于特性控制的一个功能测试宏

/user/include/features.h

/* If _GNU_SOURCE was defined by the user, turn on all the other features. */

#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 200809L

# undef _XOPEN_SOURCE

# define _XOPEN_SOURCE 700

# 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

# undef _ATFILE_SOURCE

# define _ATFILE_SOURCE 1

#endif

其中_ISOC99_SOURCE,?_POSIX_SOURCE,?_XOPEN_SOURCE都是功能测试宏,

用于指示是否包含对应标准的特性,

而这些不同的特性源于过去20多年来进行的各种标准化工作(ANSI,?ISO,?POSIX,?FIPS等),

不同的标准支持实现了不同的特性,

如系统时间的获取,stat结构是在ANSI标准中是不支持的,

而定义了_GNU_SOURCE相当于开启了对所有特性的支持。

时间: 2024-12-28 19:37:06

关于_GNU_SOURCE宏的相关文章

_GUN_SOURCE宏

问题描述:在编译程序时,提示一个错误和一个警告. error:storage size of tz isn’t know: 其中tz是struct timezone类型的变量. warning:implicit declaration of function lstat: 使用man手册查了一下,发现tz需要加上sys/time.h头文件,lstat需要加上sys/lstat.h头文件,但这两个头文件都已经包含了,百思不得其解. 无意间搜到一种解决方案,在编译时加上-D_GNU_SOURCE(定

命令行参数(argc, argv)

每个C语言程序都必须有一个称为main()的函数,作为程序启动的起点.当执行程序时,命令行参数(command-line argument)(由shell逐一解析)通过两个入参提供给main()函数.第一个参数int argc,表示命令行参数的个数.第二个参数char *argv[],是一个指向命令行参数的指针数组,每一参数又都是以空字符(null) 结尾的字符串.第一个字符串,亦即argv[0]指向的,(通常)是该程序的名称.argv中的指针列表以NULL指针结尾(即argv[argc]为NU

I/O多路复用之poll

1.select的些许缺点 回忆一下 select接口 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select需要我们指定文件描述符的最大值,然后取[0,nfds)这个范围内的值查看是在集合readfds,writefds或execptfds中,也就是说这个范围内存在一些不是我们感兴趣的文件描述符,cpu做了一些无用功,poll对她进行了

glibc_error reporting

很多GNU C库里的函数都会侦测并报告错误条件.我们的程序需要检测这些错误条件.比如:我们打开一个输入文件时需要判断该文件是否正确的打开.如果没有正确打开,我们需要打印错误或者采取其他正确的方式.为了利用这种错误报告机制,我们需要包含头文件errno.h 检测错误: 很多库函数都会返回一个特殊的值来显示函数运行出错.常见的特殊值有:-1.空指针.EOF常量.但是这些返回值只能告诉你有错误产生,但不会告诉你错误是什么.如果你想知道错误是什么,就得靠错误代码,错误代码存储在变量errno中(在err

C语言(函数)学习之strstr strcasestr

一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include <string.h> [3] 函数功能 搜索"子串"在"指定字符串"中第一次出现的位置 [4] 参数说明 haystack -->被查找的目标字符串"父串" needle -->要查找的字符串对象"子串" 注:若ne

路由器漏洞挖掘方法

MIPS32架构堆栈: 和x86 架构一样,都是由高地址向低地址增长,无EBP. 进入函数调用时,把栈指针(sp)向下移动n比特,这个大小为n比特的存储空间为此函数的stack Frame. 此后栈指针不移动,只有在函数返回时,加上这个偏移量恢复现场. 由于不能随便移动栈指针,所以寄存器压栈和出栈使用偏移 A调用B,会在A 的栈顶预留一部分空间保存b的调用参数,称为参数空间. 参数传递,前4个参数通过a0-a4传递,超出的会放入参数空间. 返回地址:把返回地址直接存入$ra寄存器. 函数执行的命

autotools

原文地址 http://blog.dccmx.com/2011/page/9/10 Autotools上手指南1--autoconf基本思想 dccmx 于 2011年 一月 7日 发表 | 最后修改于 2011年 一月 10日 要想弄懂Autotools并使用它,必须先要了解一下M4这个怪物. 那么何为M4呢,M4的名称取自Macro(M后面跟4个字母-).它和C预处理器里的宏是一个概念(其实,M4和C预处理器都K&R操刀设计的!!),用来处理文本替换.也就是说,M4是bash里的预处理器.

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

Word中 简单宏的使用

 (注意:打开文档时按住 Shift 键可以阻止 AutoOpen 宏运行) 1:Word中能够自动运行的默认宏代码名称及触发条件如下 -------------------------------------------------------- 1.名称:AutoExec 条件:启动Word或加载全局模板 2.名称:AutoNew 条件:每次生成新文档时 3.名称:AutoOpen 条件:每次打开一个已有文档时 4.名称:AutoClose 条件:每次关闭文档时 5.名称:AutoExit