不在C标准中包括strdup的理由是什么?

chq*_*lie 12 c standards

大多数C程序员都熟悉这个strdup功能.他们中的许多人会认为这是理所当然的,但它不是C标准的一部分(C89,C99和C11都不是).它是POSIX的一部分,可能并非在所有环境中都可用.事实上,微软坚持要重新命名,这_strdup增加了混乱.

用这种方式定义它很容易(在C中):

#include <string.h>

char *strdup(const char *s) {
    size_t size = strlen(s) + 1;
    char *p = malloc(size);
    if (p) {
        memcpy(p, s, size);
    }
    return p;
}
Run Code Online (Sandbox Code Playgroud)

但即使是精明的程序员也很容易弄错.

此外,仅在没有它的系统上重新定义函数证明有点复杂,如下所述:strdup()函数

为什么不在C标准的修订版中包含这些有用的广泛支持的功能?在C99的C标准库中添加了许多新功能,不包括的理由是什么strdup

Sir*_*ius 15

评论中引用的链接(http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm)给出了关于在标准库中使用strdup的"错误"的解释:

主要问题是需要向标准库添加一个函数,该函数为用户自动分配堆内存.

基本上,C语言及其标准库尽量不要假设用户如何分配和使用内存.
它提供了一些设施,其中包括堆栈和堆.

虽然malloc/free是动态内存分配的标准化,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,默认分配策略可能并不适合所有类型的应用程序.

例如,一些独立的库,如jemalloc,强调低碎片和并发性,甚至是完整的垃圾收集器,如Boehm-Demers-Weiser保守的垃圾收集器.这些库提供了malloc/free实现,这些实现仅用于替换标准*alloc和free函数,<stdlib.h>而不会破坏与C标准库其余部分的兼容性.

因此,如果strdup是标准的,那么它将被有效地取消使用第三方内存管理功能的代码(必须注意的是前面提到的jemalloc库确实提供了strdup的实现来避免这个问题).

更一般地说,虽然strdup肯定是一个实用的功能,但它的语义缺乏清晰度.它是在<string.h>头文件中声明的函数,但调用它需要通过free<stdlib.h>头部调用函数来释放返回的缓冲区.那么,它是字符串函数还是记忆函数?
将其保留在POSIX标准中似乎是避免使C标准库不太清晰的最合理的解决方案.

  • 请注意``string.h>`包含`strerror()`,但你需要`<errno.h>`来获取`errno`值或宏,然后你可以传递给`strerror()`.'strdup()`在`<string.h>'中不舒服的建议只是边缘相关 - 尽管有一些正义. (5认同)
  • 在我的辩护中,鉴于前面提到的投票结果好坏参半,我不能假装比标准委员会本身更加可信.说实话,我之前在我的代码中使用了strdup,但我不能说我非常喜欢这个函数,因为我更喜欢malloc和free位于相同的抽象层次.当你没有自己打电话给malloc时,忘记免费打电话太容易了. (2认同)