碰到过,是因为man
和头文件不一致(可能是版本导致也可能就是mistake
),
最后结果当然以实际的头文件为准。
vim /usr/include/string.h
:
#if defined __USE_GNU
extern char *strndup (__const char *__string, size_t __n)
__THROW __attribute_malloc__ __nonnull ((1));
#endif
所以显然这时候应该#define __USE_GNU
而不是#define _GNU_SOURCE
..
更新
关于_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
相当于开启了对所有特性的支持。
参考:
全站熱搜