2009-05-02 3 views
12

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

Предупреждение C4996: 'getch': Имя POSIX для этого элемента устарело. Вместо этого используйте имя ISO C++: _getch. Смотрите справку для деталей.

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

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

+3

Вы прочитали сообщение об ошибке? – jalf

+2

@jalf: «Сообщение об ошибке» неверно/вводит в заблуждение, поэтому я не вижу, как читать это поможет ... –

+12

@R ..: Нет, это не так. В нем очень четко указывается причина компилятора для выдачи предупреждения, и в нем четко указано, что они хотят от вас сделать, чтобы избежать предупреждения. Мы с вами можем не согласиться с односторонним решением Microsoft «отказаться» от стандартных функций, но предупреждение очень четко объясняет проблему, согласны ли вы с основополагающими соображениями или нет. Если вы хотите, чтобы предупреждение ушло, а предупреждение на самом деле говорит «пожалуйста, используйте эту функцию вместо этого», то, конечно же, это предупреждение. – jalf

ответ

23

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

Прочитано this answer about getcwd() тоже, для объяснения П. Дж. Плагера, который, конечно, хорошо знает материал.

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

+0

На самом деле есть разница между getchar и getch. getch блокируется, пока не будет нажата какая-либо клавиша. getchar до тех пор, пока не будет нажата клавиша ввода. –

2

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

+9

getchar - это строка буферизации, поэтому она будет ждать символа новой строки. _getch() не будет, но немедленно вернется. Я могу понять его иногда, это действительно полезно (например, «нажмите x для увеличения»). –

+1

Я не думаю, что это имеет какое-то отношение к буферизации. getchar() читается символом за раз. Тогда есть fgets и весь спектр функций Xscanf() (хотя и трудно использовать). Но, как я уже сказал, трудно предложить что-то без надлежащего контекста, особенно нестандартное расширение. – dirkgently

9

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

+0

Я не уверен, что cin/cing.get работает, например, со стрелками – tagoma

3

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

+1

'getch' имеет мало общего с' getchar'. Скорее, это интерфейс conio (и я считаю также проклятием), целью которого является интерактивное чтение одного символа с клавиатуры без буферизации/задержки. –

+0

POSIX не входит в него в случае этой конкретной функции, но * большинство * функций, которые были устаревшими в пользу символов подчеркивания, были похожими на POSIX функциями, такими как 'open' или' mkdir'. Думаю, они просто не хотели беспокоиться о создании отдельного предупреждающего сообщения за несколько исключений. –

4

use _getch() вместо getch()

+2

Не могли бы вы объяснить, почему ассер должен использовать один вместо другого? Устранение проблемы хорошо, но понимание проблемы и почему решение работает еще лучше. – MCeley