关于__GNU_SOURCE 这个宏---如何开启【转】

简介: 关于__GNU_SOURCE 这个宏 转自:http://blog.csdn.net/stevenliyong/article/details/4160181 版权声明:本文为博主原创文章,未经博主允许不得转载。

今天发现一个奇怪的问题,即使
#include sys/stat.h
在使用  lstat 函数的时候还是会报
warning: implicit declaration of function 'lstat'

另外同样的问题,即使include 了 sys/time.h
还是会报
warning: implicit declaration of function 'nanosleep'


同样,即使include 了 sys/time.h  time.h
warning: implicit declaration of function 'clock_gettime'
error: 'CLOCK_MONOTONIC' undeclared (first use in this function)

最后发现 sys/time.h sys/stat.h time.h 都include 一个共同的头文件 features.h
原来这是用来让用户配置编译环境的头文件。再看一下_GUN_SOURCE这个宏,这个宏可以让用户打开所有feature.

/* 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 200112L
# 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
# undef  _ATFILE_SOURCE
# define _ATFILE_SOURCE 1
#endif
   
因此解决问题的办法很简单
只要在source file的开头 加上
#define _GNU_SOURCE
就可以了。


另外必须注意include 的先后次序
#include time.h
#include sys/time.h
顺序搞反了的话 clock_gettime CLOCK_MONOTONIC 是编译无法通过的。这是因为time.h是标准头文件
,而sys/time.h 是你当前系统的头文件。

 
 
如何开启_GNU_SOURCE宏
转自: http://blog.csdn.net/satanwxd/article/details/6234577

在编写网络程序时,会涉及到一些关于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文件,运行一下就知道是否开启了

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
算法 前端开发 JavaScript
若依框架---数据转树状层级
若依框架---数据转树状层级
1005 0
|
存储 JSON 监控
eBPF 深度探索: 高效 DNS 监控实现(下)
eBPF 深度探索: 高效 DNS 监控实现(下)
1067 0
7-10 百钱百鸡
百鸡问题:“今有鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。凡百钱买鸡百只,问鸡翁母雏各几何。” 百鸡问题是北魏数学家张丘建在《张丘建算经》中提出的一个世界著名的不定方程问题,它给出了由三个未知量的两个方程组成的不定方程组的解。
7-10 百钱百鸡
|
数据挖掘 API 开发者
如何使用Python调用API接口获取淘宝商品数据
随着互联网的发展,API接口已经成为了不同软件、平台之间数据传输的标配。淘宝作为中国最大的电商平台,提供了丰富的API接口供开发者使用。通过调用这些接口,我们可以轻松地获取淘宝的商品数据,为数据分析、学术研究、商业应用等场景提供数据支持。
|
网络安全 定位技术 数据中心
蓝易云 - 什么是香港站群服务器,以及优点
注意,虽然香港站群服务器有上述优点,但是根据具体的业务需求和预算,可能并不是所有的站群都适合使用香港站群服务器。
163 0
|
Go 网络安全
AC自动机:文本搜索的加速器
在数字化时代,文本数据的海洋浩瀚无垠。我们经常需要在这些数据中迅速找到特定的信息,比如在日志文件中查找异常、在海量文本中检索关键词,或是在编译代码时识别语法结构。这时候,AC自动机(Aho-Corasick自动机)就成为了我们的得力助手。
|
人工智能 自然语言处理 达摩院
【OpenVI—AI热点日报】8月7号
AI热点日报八月第5期隆重推出! 我们汇集了最新的AI热点信息、最新论文和观点,为您提供最前沿的AI领域资讯。 (往期链接请在子社区查看官方博文哦~)
505 2
【OpenVI—AI热点日报】8月7号
|
存储 缓存 安全
Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
5633 0
Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
|
移动开发 API
阿里云域名续费优惠口令及新老顾客优惠大全
阿里云域名续费优惠口令及新老顾客优惠大全,2023年阿里云域名优惠口令,com域名续费优惠口令“com批量注册更享优惠”,cn域名续费优惠口令“cn注册多个价格更优”,com域名注册优惠口令“梦想从域名开始”,cn域名注册优惠口令“互联网上的中国标识”,,阿里云优惠口令是域名专属的优惠码
416 0
|
容器 安全 云安全
安全容器的发展与思考
作者:王旭 蚂蚁金服资深技术专家,kata containers 架构委员会成员刘奖 阿里云操作系统资深技术专家 本文根据云栖大会容器专场演讲内容整理,关注公众号,回复“安全”获得本文 PPT 大家中午好,感谢大家在饥肠辘辘的中午不离不弃地来到我们的会场,我们带给大家的这段相声是关于安全容器技术的。