c - Linux 上的 strdup 使用哪个宏?

标签 c strdup

我在 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/

相关文章:

c - 管道和 fork - scanf 只读取一个字符

C - 尝试使用 strdup 时出现段错误

c - 释放导致崩溃

c - 使用 strdup 进入 malloc 保留空间

c# - zlib 的 gzip 压缩和 .NET 的 GZipStream 使用的压缩有什么区别?

c - 是否有可能从抽象/基本结构继承或在 C 中沿着这些线路模拟某些东西?

c - 有没有办法保存带参数的函数调用?

c - 在调用 strdup() 之前使用 free() 分配值的 char

c - = 的操作数具有非法类型

c# - C bool 逻辑