【问题标题】:why is __STDC_WANT_LIB_EXT2__ needed in C?为什么在 C 中需要 __STDC_WANT_LIB_EXT2__ ?
【发布时间】:2021-12-30 14:42:55
【问题描述】:

cpp reference page for strdup 上,我注意到它说,

与 Dynamic Memory TR 中的所有函数一样,只有在实现定义了 __STDC_ALLOC_LIB__ 并且用户在包含 string.h 之前将 __STDC_WANT_LIB_EXT2__ 定义为整数常量 1 时,才能保证 strdup 可用。

我认为函数strdup所做的只是简单的malloc一个空间和strcpy该空间的源,我也在glibc中找到了它的实现。

char * __strdup (const char *s)
{
  size_t len = strlen (s) + 1;
  void *new = malloc (len);

  if (new == NULL)
    return NULL;

  return (char *) memcpy (new, s, len);
}

它的实现并没有什么特别之处,那么为什么我要在使用strdup(或任何其他动态内存TR)之前将__STDC_WANT_LIB_EXT2__定义为整数1?在这里定义__STDC_WANT_LIB_EXT2__ 有什么作用?

【问题讨论】:

标签: c


【解决方案1】:

正如 page you linked 的顶部所阐明的那样,strdup 函数直到 C23(具有 not yet been finalized)才正式成为 C 标准库的一部分。

在此之前,它以“dynamic memory extension”的形式提供,这是 2010 年引入的 C 标准的一组扩展。实现这些扩展的 C 标准库(例如 GNU C 标准库)的编译器和实现通常将它们“隐藏”在宏后面, 例如STDC_WANT_LIB_EXT2 在这种情况下。有关这些特殊功能宏的更多 Glibc 示例,请参阅 Feature Test Macros


strdup 特别是早在 2010 年之前就已经存在。作为 glibc 实现的 POSIX 标准的一部分,因此,如果您使用 GNU 工具链,则无需显式定义上述宏。

See here 获取更多 POSIX 函数示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 2019-04-20
    • 2010-10-14
    • 2016-09-06
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多