我已经在 StackOverflow 上的代码示例中看到了 strdup,并且刚刚尝试在 Linux(3.0.0-21-generic x86_64)上使用它。
编译器(clang)知道它在 string.h 中,但仍然抱怨即使包含 string.h 也没有原型。事实证明,strdup 包含在 string.h 中定义的 #if 中。我搜索了这个站点,发现一个帖子说 strdup 是POSIX例程,而不是 C 标准库例程。
可能会暴露它的宏是
- __USE_SVID
- __USE_BSD
- __USE_XOPEN_EXTENDED
- __USE_XOPEN2K8
这些中的每一个都未在包含在 stdlib.h 中的 features.h 中定义。
为什么该列表中没有 POSIX 宏以及人们使用哪个宏/编译器开关来公开 string.h 中的 strdup?
编辑:根据吉姆在下面的评论,我发现
#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:根据基思的评论,我发现这也有效:
#define _POSIX_C_SOURCE 200809L
编辑3:根据乔纳森的评论,这些也有效
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700