2009-05-02 9 views
12

Irgendwo zurück in der Zeit habe ich ein paar C und C++ in der Schule, aber ich habe nicht viel Aufmerksamkeit auf C++. Jetzt möchte ich etwas auf C++ achten, aber wenn ich die getch() Funktion benutze, bekomme ich die Warnung von unten.getch ist veraltet

Warnung C4996: 'getch': Der POSIX-Name für dieses Element ist veraltet. Verwenden Sie stattdessen den übereinstimmenden ISO C++ - Namen: _getch. Weitere Informationen finden Sie in der Online-Hilfe.

Jetzt verwende ich VS 2005 Express, und ich weiß nicht, was ich mit dieser Warnung tun soll. Ich brauche getch() nach I printf() eine Fehlermeldung oder etwas anderes, die einen Schlüsseltreffer erfordern.

Können Sie mir dabei helfen?

+3

Haben Sie die Fehlermeldung gelesen? – jalf

+2

@jalf: Die "Fehlermeldung" ist falsch/irreführend, also sehe ich nicht, wie das Lesen helfen würde ... –

+12

@R ..: Nein ist es nicht. Es gibt sehr deutlich den Grund des Compilers für die Ausgabe der Warnung an und es gibt genau so deutlich an, was sie tun sollen, um die Warnung zu vermeiden. Sie und ich sind möglicherweise nicht einverstanden mit der einseitigen Entscheidung von Microsoft, Standardfunktionen abzulehnen, aber die Warnung erklärt das Problem sehr deutlich, unabhängig davon, ob Sie der zugrunde liegenden Argumentation zustimmen oder nicht. Wenn Sie möchten, dass die Warnung verschwindet und die Warnung "Bitte verwenden Sie stattdessen diese Funktion" anzeigt, hilft das Lesen der Warnung. – jalf

Antwort

23

Microsoft hat beschlossen, den Namen ohne unterstrichenen Unterstrich zu markieren, da diese Namen dem Programmierer vorbehalten sind. Implementation-spezifische Erweiterungen sollten Namen verwenden, die mit einem Unterstrich im globalen Namespace beginnen, wenn sie den C- oder C++ - Standard einhalten wollen - oder sie sollten sich selbst als eine kombinierte standardkonforme Umgebung wie POSIX/ANSI/ISO C bezeichnen Funktion entspricht dann einem dieser Standards.

Gelesen this answer about getcwd() auch, für eine Erklärung von P. J. Plauger, der Sachen natürlich sehr gut weiß.

Wenn Sie nur auf einige vom Benutzer eingegebene Schlüssel warten möchten, gibt es keinen Grund, getchar nicht zu verwenden. Aber manchmal ist es einfach praktischer und bequemer für den Benutzer, _getch und Freunde zu verwenden. Diese werden jedoch nicht vom C- oder C++ - Standard angegeben und begrenzen somit die Portabilität Ihres Programms. Merk dir das.

+0

Tatsächlich gibt es einen Unterschied zwischen getchar und getch. getch blockt, bis eine Taste gedrückt wird. getchar blockt bis Enter gedrückt wird. –

2

Warum brauchen Sie das? Warum nicht getchar() verwenden, wenn Sie ein einzelnes Zeichen erfassen müssen?

+9

getchar ist liniengepuffert, daher wird auf ein Zeilenumbruchzeichen gewartet. _getch() wird nicht, sondern sofort zurückkehren. Ich kann ihn manchmal verstehen, es ist wirklich nützlich ("drücke zB x um zu zoomen"). –

+1

Ich glaube nicht, dass es etwas mit Pufferung zu tun hat. getchar() liest jeweils ein Zeichen ein. Es gibt dann fgets und den gesamten Bereich der Xscanf() - Funktionen (wenn auch schwierig zu verwenden). Aber wie gesagt, es ist schwierig, etwas ohne richtigen Kontext vorzuschlagen, insbesondere eine nicht standardisierte Erweiterung. – dirkgently

9

Wenn Sie in C++ sind, warum printf und getch? Verwenden Sie stattdessen cout und cin.get.

+0

Ich bin mir nicht sicher cin/cing.get funktioniert zB mit den Pfeiltasten – tagoma

3

Wie der Fehler sagt, ist der Name getch() veraltet (da dies eine Microsoft-spezifische Erweiterung war), und _getch() wird stattdessen empfohlen. Ich bin nicht sicher, wo POSIX hineinkommt; POSIX definiert getch() nicht, sondern enthält stattdessen getchar(), wie von der ISO C standard (Seite 298, Entwurf verknüpft, da der endgültige Standard nicht frei ist) angegeben. Die Lösung wäre, wie vorgeschlagen vorzugehen und _getch() zu verwenden oder den Standard C getchar() zu verwenden.

+1

'getch' hat wenig mit' getchar' zu tun. Vielmehr ist es eine Conio-Schnittstelle (und ich glaube auch Flüche), deren Zweck es ist, interaktiv ein einzelnes Zeichen von der Tastatur ohne Pufferung/Verzögerung zu lesen. –

+0

POSIX kommt bei dieser speziellen Funktion nicht dazu, aber * most * der Funktionen, die zugunsten von Unterstreichungsversionen veraltet waren, waren POSIX-ähnliche Funktionen wie 'open' oder' mkdir'. Ich schätze, sie wollten einfach keine separate Warnmeldung für die wenigen Ausnahmen erstellen. –

4

Verwenden Sie _getch() anstelle von getch()

+2

Können Sie erklären, warum der Fragesteller einen statt des anderen verwenden sollte? Das Problem zu beheben ist gut, aber das Problem zu verstehen und warum die Lösung funktioniert, ist noch besser. – MCeley