您的位置:首页 > 其它

_GUN_SOURCE宏

2015-12-15 08:57 330 查看
问题描述:在编译程序时,提示一个错误和一个警告。

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(定义_GNU_SOURCE宏),于是照做,程序编译通过。继续了解了_GNU_SOURCE宏,发现它是在features.h中用于特性控制的一个功能测试宏,而上面提到的两个头文件sys/time.h,
sys/stat.h都包含了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相当于开启了对所有特性的支持。

 

另外一个问题:在程序运行时,提示mmap出错,错误号22(Invalid argument)。

我的工作目录是window桌面上的一个目录,通过虚拟机工具共享到linux里使用,mmap映射的文件也在这个目录中。

 

怀疑是虚拟机内存不足,看了下freemem,内存是足够的,把机器重启了,依然出现同样的问题。把代码拷到机房的机器(64bit),编译运行,工作正常。猜想被映射的文件不是系统下的文件导致映射失败,于是把被映射文件拷到家目录下,工作正常。原理我也解释不清楚,理论上能打开文件不就能进行内存映射么?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: