是()正式弃用?

基于最新的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)

我可以安全地说在C和C ++中都不推荐使用gets()吗?

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

编辑:好的,这是一个安全使用gets ,关于我能想到的唯一一个…

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

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

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

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

在各地实施C ++ 11之前,还需要一段时间。

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

例如,微软没有。

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

好吧它完全从C11标准中删除了,所以我把它当作是的。