基于最新的 C++11 草案,C++ 参考 ISO/IEC 9899:1999/Cor.3:2007(E) 来定义 C 库函数(根据 §1.2[intro.refs]/1) .
基于 C99 TC3 的最新草案,The gets function is obsolescent, and is deprecated.
(根据 §7.26.9/2)
我可以肯定地说gets()
在 C 和 C++ 中都已弃用它吗?
不推荐使用意味着您不应该使用它,并且将来可能会被删除。由于两个标准都说它已被弃用,这意味着它已被正式弃用。
有关系吗?您可以使用的唯一方法gets
是如果stdin
已知附加到您可以完全控制其内容的文件。这个条件几乎不可能满足,尤其是在多进程系统上,其他进程可能会相对于您的程序异步修改文件。因此,出于所有实际目的,使用的任何程序gets
都具有未定义的行为(即,可能存在未定义行为的输入/环境条件),尤其是 UB,如果您的程序具有更高的权限,则可能导致权限妥协数据的提供者。
编辑:好的,这是一个安全的使用方法gets
,关于我能马上想到的唯一一个......
if (feof(stdin)) gets(buf);
当然,即使已经为流设置了 EOF 指示符,一些错误的实现(可能包括 glibc..?)也允许读取,所以....
即使是从库中删除gets() 会破坏的代码,在删除之后也会比删除之前更少破坏。我想编译器供应商可能有必要将它包含在“完全符合标准”的模式中,但是可以安全使用它的情况非常少,以至于将它排除在“正常”模式之外可能是合理的“ 建造。
直到 C++11 到处实现还需要一段时间。
此外,大多数编译器甚至还不完全支持 C99。
例如,微软就没有。
所以不,它在 C 和 C++ 中都没有被弃用。
好吧,它完全从 C11 标准中删除了,所以我认为这是肯定的。