C 为什么string.h库中有这么多函数是;“不建议使用”;?

C 为什么string.h库中有这么多函数是;“不建议使用”;?,c,string,standards,history,C,String,Standards,History,关于C源代码,我试图了解一些东西,为什么在大多数问题中不推荐使用这些函数。像strtok或strncpy一样,使用它们是不安全的。Evrywhere我看到了编写我自己的实现的建议。为什么标准不会改变,例如BSD,而是留给这些“怪物”它们仍然存在,因为它们与仍然使用它们的“旧系统”/“代码”有着历史上的祖先关系,即支持“向后兼容性” 建议自己的实现让程序员使用自己的逻辑,因为没有人比程序员自己更了解他们的环境,例如,strtok不是线程安全的。有很多遗留的“C”和“C++”代码。如果他们从“C”运

关于C源代码,我试图了解一些东西,为什么在大多数问题中不推荐使用这些函数。像
strtok
strncpy
一样,使用它们是不安全的。Evrywhere我看到了编写我自己的实现的建议。为什么标准不会改变,例如BSD,而是留给这些“怪物”

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


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

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

有时,它们会给出“不推荐的”编译器消息(MSFT喜欢这样),因此您将发现并改用新的、更安全的函数


当然,新代码应该使用“安全”函数,但我们中的许多人都被旧的编译器和遗留代码所困扰:)

这都只是教条。使用这些函数时请注意,它们与您的目标无关,因为它们可能无法在所有情况下工作(例如strtok和多线程),或者它们希望在使用之前/之后捕获条件(例如strncpy和缺少终止字符)。

C是20世纪70年代早期的产品,它显示了这一点。许多不确定的库函数都是在C用户群体非常小且仅限于学术界时编写的,其中大多数都是有经验的程序员

到1989年第一个标准发布时,这些原始库函数已经在价值10到15年的遗留代码中根深蒂固(不仅仅是Unix操作系统及其大多数工具)。负责标准化的委员会不愿意打破现有的代码库,因此这些功能基本上被纳入了标准中;真正改变的是向声明中添加原型语法,并在必要时将
char*
更改为
void*
malloc
memcpy
memset
,等等)


好吧,自从标准化以来,实际上只从语言中删除了一个库函数-
得到了
。一次库调用所造成的混乱比破坏价值近40年的遗留代码更可怕

“在我看到的每个地方,我都建议自己编写实现”——不要相信它们
strtok()->strtok_r()
strncpy()->memcpy()
,随便什么。原因1:向后兼容性。原因2:C标准库是标准化的(真令人惊讶),但没有人在意。相反,操作系统和工具链供应商不断推出他们自己的扩展。如果您了解他们的特定故障或局限性,许多扩展都可以使用。e、 strtok不是线程安全的,但是如果你只是简单地编写一个单线程程序,那就没有问题了。同样地,
strncpy
可能是“不安全的”,但可以与定义良好的输入一起使用。关键是要理解为什么某些函数被替换或弃用。通过跟踪libc等库的发展,您可以学到很多东西。
strncpy
的问题不是“定义良好的输入”的问题,而是该函数不用于将字符串复制到其他字符串。
strncpy()
的目的是将字符串复制到空填充的固定大小缓冲区中。不是“空终止”,而是“空填充”。副本的目标不是字符串,而是固定大小的缓冲区。因此,
strncpy()。C本来是一种编程语言,而不是汇编语言,如果我们能像Java标准库一样提供程序员所需的一切,为什么每次都要重新发明轮子呢?好吧,这就是我所期望的:)我猜还有另一个原因,因为缺乏好的C库是1)很难编写它们2)大多数用C编写的人都使用它进行非常接近硬件的操作,所以他们实现了他们所需要的最小的东西,其余的代码处理与位相关的逻辑。讨厌它,但这不会让它消失。我正在开发一个系统,它确实需要从底层开始废弃和重建,但这永远不会发生。这个故事的真正寓意是历史是一个残酷的情妇。