我已经看到在StackOverflow上的代码示例中使用了strdup,并且刚刚尝试在Linux上使用它(3.0.0-21-通用x86_64)。
编译器(clang)知道它在string.h中,但仍然抱怨即使包含string.h也没有原型。事实证明strdup包含在string.h中定义的#if中。我搜索了这个网站,发现一篇文章说strdup是 POSIX 例程,而不是C标准库例程。
将公开它的可能宏是
每个都在feature.h中未定义,由stdlib.h包含。
为什么不在该列表中的POSIX宏以及哪些宏/编译器开关用于在string.h中公开strdup?
编辑:根据Jim的评论,我发现
#define _POSIX_SOURCE 1
或
#define _POSIX_C_SOURCE 1
上面
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
不要在我的系统上公开strdup。
但这些确实:
#define _BSD_SOURCE 1
#define _SVID_SOURCE 1
编辑2:Per Keith的评论,我发现这也有效:
#define _POSIX_C_SOURCE 200809L
编辑3:根据乔纳森的评论,这些也有效
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
答案 0 :(得分:3)
__USE ...宏供内部使用。您应该定义_POSIX_SOURCE,或者可能是feature.h中注释中描述的其他功能宏之一...例如,从我刚从Web上抓取的版本(显然是一个旧的,有些过时的版本),
__STRICT_ANSI__ ANSI Standard C.
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if ==2 add IEEE Std 1003.2.
_BSD_SOURCE ANSI, POSIX, and 4.3BSD things.
_SVID_SOURCE ANSI, POSIX, and SVID things.
_GNU_SOURCE All of the above, plus GNU extensions.
因此,定义_GNU_SOURCE会为您提供一切。
编辑:根据Keith Thompson的评论,你需要
#define _POSIX_C_SOURCE 200809L
for strdup。