getch已被弃用

20

我曾经在大学学习过C和C++,但我没有太关注C++。现在我希望关注一下C++,但当我使用 getch() 函数时,我收到了下面的警告:

警告 C4996: 'getch': 此项的 POSIX 名称已被弃用。请改用符合 ISO C++ 标准的名称: _getch。有关详细信息,请参阅在线帮助。

现在,我正在使用VS 2005 Express,我不知道该如何处理这个警告。我需要在打印错误消息或其他需要按键的情况下使用 getch()

你能帮我解决这个问题吗?


4
你读了错误信息吗? - jalf
2
@jalf:这个“错误信息”是错误/误导性的,所以我不认为阅读它会有帮助... - R.. GitHub STOP HELPING ICE
12
@R..:不,不是这样的。它非常清楚地说明了编译器发出警告的原因,并且非常清楚地说明了他们希望你做什么来避免警告。你和我可能不同意Microsoft单方面决定“弃用”标准函数,但无论你是否同意根本原因,警告都非常清楚地解释了这个问题。如果你想让警告消失,并且警告实际上说“请改用此函数”,那么阅读警告肯定有所帮助。 - jalf
5
提及POSIX是错误和误导的,这与POSIX无关。此外,该函数不是标准函数,它是由conio(我相信还有curses)用于从键盘进行交互式单字符读取而没有缓冲区的函数名称。 - R.. GitHub STOP HELPING ICE
6个回答

26

微软决定将不带下划线的名称标记为过时,因为这些名称保留供程序员选择。如果实现特定扩展想要遵守C或C ++标准,则应在全局命名空间中使用以下划线开头的名称; 或者他们应标记自己为符合组合标准的环境,例如POSIX / ANSI / ISO C,在这种情况下,此函数相当于其中一个标准。

还可以阅读有关getcwd()的此答案,由 P.J. Plauger 提供解释,他当然非常了解这方面的知识。

如果您只是对等待用户键入的某些按键感兴趣,则使用getchar没有任何理由不可行。但有时对用户来说,使用_getch和类似函数更实用和方便。但是,这些函数未在C或C++标准中指定,因此会限制程序的可移植性。请记住这一点。


1
实际上,getchar和getch之间有区别。getch会阻塞程序直到某个键被按下。而getchar则会阻塞程序直到回车键被按下。 - Patrick Sturm

9

如果你喜欢使用C++,为什么不考虑使用coutcin.get,而选择使用printfgetch呢?这样能使代码更易读懂。


1
我不确定 cin / cing.get 是否能够使用箭头键。 - tagoma

6

使用 _getch() 代替 getch()


6
您能解释一下为什么提问者应该使用其中一个而不是另一个吗?解决问题固然好,但理解问题以及为什么解决方案有效会更好。 - Michael Celey

5
正如错误提示所说,名称为getch()的函数已经被弃用(因为它是微软特有的扩展),建议使用_getch()代替。我不确定POSIX与此有何关系;POSIX并没有定义getch(),而是包含了getchar(),正如ISO C标准所规定的一样(页面298,链接到草案,因为最终标准不免费)。解决方法是按照建议使用_getch()或使用标准C getchar()

3
getchgetchar关系不大。相反,它是一个conio(我认为也包括curses)接口,其目的是从键盘交互式地读取单个字符而不进行缓冲/延迟。 - R.. GitHub STOP HELPING ICE
在这个特定函数的情况下,POSIX并不起作用,但是大多数被弃用的函数都是像openmkdir这样的类POSIX函数,以获得下划线版本。可能他们只是不想为少数例外创建单独的警告消息。 - Harry Johnston

1

你为什么需要这个?如果你只需要捕获一个单独的字符,为什么不使用getchar()呢?


12
getchar是行缓冲的,因此它会等待换行符。_getch()不会,而是立即返回。有时我能理解它真的很有用(例如,“按x键进行缩放”)。 - Johannes Schaub - litb
1
我认为这与缓冲无关。getchar()一次读入一个字符。然后有fgets和整个Xscanf()函数范围(虽然难以使用)。但正如我所说,没有适当的上下文,特别是非标准扩展,很难建议任何东西。 - dirkgently

0

你可以使用 "std::getc(stdin);"。它的作用类似于我的程序中的 'getch();'。 我认为这是 'getch()' 的一个很好的替代品。 如果我错了,请告诉我。

#include <cstdio>

switch (std::getc(stdin)) {
    case 'a':   cout << 'a' << endl ; break;
    case 'b':   cout << 'b' << endl ; break;
    default:    cout << '$' << endl; break;
}

如果您在控制台输入'a',它会输出'a'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接