为什么string.h库中有这么多函数“不推荐使用”?

时间:2013-07-21 19:56:36

标签: c string standards history

我试图了解C起源,为什么有些功能不推荐用于大多数SO问题。与strtokstrncpy一样,它们根本不安全。 Evrywhere我看到建议写我自己的实现。为什么标准不会将strncpy改为例如BSD strlcpy,而是留给这些“怪物”?

4 个答案:

答案 0 :(得分:2)

C是20世纪70年代早期的产品,它表明了这一点。许多iffier库函数是在C用户社区非常小并且仅限于学术界时编写的,其中大多数是经验丰富的程序员。

到1989年发布第一个标准时,那些原始库函数已经在10到15年的遗留代码中得到了巩固(其中最简单的是Unix操作系统及其大多数工具)。负责标准化的委员会不愿打破现有的代码库,因此这些功能很可能被纳入标准;所有真正改变的是在声明中添加原型语法,并在必要时将char *更改为void *mallocmemcpymemset等。

AFAIK,自标准化以来,只有一个库函数被删除 - gets。由一个库调用引起的混乱比破坏现在近40年的遗留代码的前景更可怕。

答案 1 :(得分:1)

那里有很多遗留的“C”和“C ++”代码。如果他们从“C”运行时库中删除了所有“不安全”的函数,那么许多开发人员都无法升级他们的编译器,因为所有旧代码都不会再构建。

有时候他们会给出“弃用的”编译器消息(MSFT很喜欢这个),所以你会发现并改变使用新的更安全的函数。

新代码当然应该使用“安全”功能,但是我们很多人都坚持使用旧的编译器和遗留代码来维护:)

答案 2 :(得分:0)

它们仍然存在,因为历史祖先关系仍然使用它们的“旧系统”/“代码” - 即支持“向后兼容性”

建议自己实现让程序员使用他们自己的逻辑,风险自负,因为没有人能比程序员本人更了解他们的环境,例如,strtok不是线程安全的。

答案 3 :(得分:-1)

这一切都只是教条。使用这些函数只是意识到它们对你的目标无动于衷,因为它们可能无法在所有情况下工作(即strtok和多线程),或者它们期望在使用之前/之后捕获条件(即strncpy和缺少终止字符)