Linux上哪个宏与strdup一起使用?

时间:2012-09-25 01:59:50

标签: c strdup

我已经看到在StackOverflow上的代码示例中使用了strdup,并且刚刚尝试在Linux上使用它(3.0.0-21-通用x86_64)。

编译器(clang)知道它在string.h中,但仍然抱怨即使包含string.h也没有原型。事实证明strdup包含在string.h中定义的#if中。我搜索了这个网站,发现一篇文章说strdup是 POSIX 例程,而不是C标准库例程。

将公开它的可能宏是

  • __ USE_SVID
  • __ USE_BSD
  • __ USE_XOPEN_EXTENDED
  • __ USE_XOPEN2K8

每个都在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

1 个答案:

答案 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。