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