_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(定義_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相當于開啟了對所有特性的支持。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成