我在 StackOverflow 上的代码示例中看到了 strdup 的使用,并且刚刚尝试在 Linux (3.0.0-21-generic x86_64) 上使用它。
编译器(clang)知道它在 string.h 中,但仍然提示即使包含 string.h 也没有原型(prototype)。事实证明,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:根据 Keith 的评论,我发现这也有效:
#define _POSIX_C_SOURCE 200809L
编辑 3:根据 Jonathan 的评论,这些也有效
#define _XOPEN_SOURCE 500
#define _XOPEN_SOURCE 600
#define _XOPEN_SOURCE 700
最佳答案
__USE... 宏供内部使用。您应该定义 _POSIX_SOURCE,或者可能是您的 feature.h 中的注释中描述的其他功能宏之一...例如,来 self 刚刚从网络上获取的版本(显然是旧的且有些过时的版本),
__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
对于 strdup。
关于c - Linux 上的 strdup 使用哪个宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575267/