5

基于最新的 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++ 中都已弃用它吗?

4

5 回答 5

4

不推荐使用意味着您不应该使用它,并且将来可能会被删除。由于两个标准都说它已被弃用,这意味着它已被正式弃用。

于 2011-09-14T22:31:40.223 回答
3

有关系吗?您可以使用的唯一方法gets是如果stdin已知附加到您可以完全控制其内容的文件。这个条件几乎不可能满足,尤其是在多进程系统上,其他进程可能会相对于您的程序异步修改文件。因此,出于所有实际目的,使用的任何程序gets都具有未定义的行为(即,可能存在未定义行为的输入/环境条件),尤其是 UB,如果您的程序具有更高的权限,则可能导致权限妥协数据的提供者。

编辑:好的,这是一个安全的使用方法gets,关于我能马上想到的唯一一个......

if (feof(stdin)) gets(buf);

当然,即使已经为流设置了 EOF 指示符,一些错误的实现(可能包括 glibc..?)也允许读取,所以....

于 2011-09-14T22:28:34.123 回答
1

即使是从库中删除gets() 会破坏的代码,在删除之后也会比删除之前更少破坏。我想编译器供应商可能有必要将它包含在“完全符合标准”的模式中,但是可以安全使用它的情况非常少,以至于将它排除在“正常”模式之外可能是合理的“ 建造。

于 2011-09-14T22:29:38.273 回答
0

直到 C++11 到处实现还需要一段时间。

此外,大多数编译器甚至还不完全支持 C99。

例如,微软就没有。

所以不,它在 C 和 C++ 中都没有被弃用。

于 2011-09-14T22:23:17.177 回答
0

好吧,它完全从 C11 标准中删除了,所以我认为这是肯定的。

于 2013-08-02T01:35:18.077 回答