2

我已经在 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
4

1 回答 1

3

__USE... 宏供内部使用。您应该定义 _POSIX_SOURCE,或者可能是您的 feature.h 中的注释中描述的其他功能宏之一......例如,从我刚刚从网上抓取的版本(显然是一个旧的且有些过时的版本),

   __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。

于 2012-09-25T02:05:05.167 回答