17

回到过去,我在大学里学过一些 C 和 C++,但我对 C++ 的关注并不多。现在我想关注 C++,但是当我使用该getch()函数时,我从下面收到警告。

警告 C4996:'getch':不推荐使用此项目的 POSIX 名称。而是使用符合 ISO C++ 的名称:_getch。详细信息请参见在线帮助。

现在,我正在使用 VS 2005 express,我不知道如何处理这个警告。我需要在出现错误消息或需要按键的其他内容getch()后使用。printf()

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

4

6 回答 6

25

Microsoft 决定不推荐使用不带下划线的名称,因为这些名称是保留给程序员选择的。如果特定于实现的扩展想要遵守 C 或 C++ 标准,则它们应该在全局命名空间中使用以下划线开头的名称——或者它们应该将自己标记为符合标准的组合环境,例如 POSIX/ANSI/ISO C,其中这样的功能则对应于这些标准之一。

也阅读这个关于 getcwd() 的答案,以获得 PJ Plauger 的解释,他当然非常了解这些东西。

如果您只对等待用户键入的某些键感兴趣,那么真的没有理由不使用getchar. 但有时只是更实用、更方便用户_getch和朋友使用。但是,C 或 C++ 标准没有指定这些,因此会限制程序的可移植性。记住这一点。

于 2009-05-02T14:57:35.873 回答
9

如果你喜欢 C++,为什么printfgetch?考虑使用coutandcin.get代替。

于 2009-05-02T15:04:46.857 回答
5

使用 _getch() 而不是 getch()

于 2013-04-02T19:07:27.240 回答
4

正如错误所说,该名称getch()已被弃用(因为这是 Microsoft 特定的扩展),_getch()而是建议使用。我不确定 POSIX 是从哪里来的。POSIX 没有定义getch(),而是包含ISO C 标准(第 298 页,草案链接到,因为最终标准不是免费的)getchar()所指定的内容。解决方案是按照建议进行操作并使用,或使用标准C。_getch()getchar()

于 2009-05-02T15:05:53.827 回答
2

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

于 2009-05-02T14:56:25.487 回答
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”。

于 2019-02-02T11:19:43.240 回答