getch устарела - PullRequest
       23

getch устарела

14 голосов
/ 02 мая 2009

Когда-то в колледже я немного занимался Си и Си ++, но не обращал особого внимания на Си ++. Теперь я хочу обратить внимание на C ++, но когда я использую функцию getch(), я получаю предупреждение снизу.

Предупреждение C4996: 'getch': имя POSIX для этого элемента устарело. Вместо этого используйте имя, соответствующее ISO C ++: _getch. Для получения подробной информации см. Интерактивную справку.

Теперь я использую VS 2005 Express, и я не знаю, что делать с этим предупреждением. Мне нужно использовать getch() после того, как я printf() сообщу об ошибке или что-то еще, что требует нажатия клавиши.

Можете ли вы помочь мне с этим?

Ответы [ 6 ]

23 голосов
/ 02 мая 2009

Microsoft решила пометить имя без подчеркивания как устаревшее, потому что эти имена зарезервированы для выбора программистом. Специфичные для реализации расширения должны использовать имена, начинающиеся с подчеркивания в глобальном пространстве имен, если они хотят придерживаться стандарта C или C ++ - или они должны помечать себя как объединенную среду, соответствующую стандарту, такую ​​как POSIX / ANSI / ISO C, где такая Функция соответствует одному из этих стандартов.

Прочтите и этот ответ о getcwd () , для объяснения П. Дж. Плаугера, который, конечно, хорошо разбирается в вещах.

Если вам интересно подождать только несколько клавиш, набранных пользователем, на самом деле нет причин не использовать getchar. Но иногда пользователю просто удобнее и удобнее пользоваться _getch и друзьями. Однако они не определены Стандартом C или C ++ и, таким образом, ограничат переносимость вашей программы. Имейте это в виду.

9 голосов
/ 02 мая 2009

Если вы в C ++, почему printf и getch? Попробуйте вместо этого использовать cout и cin.get.

4 голосов
/ 02 апреля 2013

используйте _getch () вместо getch ()

3 голосов
/ 02 мая 2009

Как говорится в сообщении об ошибке, имя getch() устарело (так как это было расширение, специфичное для Microsoft), и вместо него рекомендуется _getch(). Я не уверен, где POSIX входит в это; POSIX не определяет getch(), но вместо этого включает getchar(), как указано в стандарте ISO C (страница 298, черновик связан с тем, что окончательный стандарт не является свободным). Решение состоит в том, чтобы сделать как предложено и использовать _getch(), или использовать стандарт C getchar().

3 голосов
/ 02 мая 2009

Зачем тебе это? Почему бы не использовать getchar(), если вам нужно захватить один символ?

0 голосов
/ 02 февраля 2019

вы можете использовать "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;
}

Он выводит «а», если вы вводите «а» на консоли.

...