2009-05-02 15 views
12

私は大学でCとC++をやりましたが、C++に多くの関心を寄せていませんでした。今私はC++に注意を払いたいと思いますが、私がgetch()関数を使用しているときに、私は下から警告を受け取ります。getchは非難されました

警告C4996: 'getch':この項目のPOSIX名は非推奨です。代わりに、ISO C++の適合名_getchを使用します。詳細については、オンラインヘルプを参照してください。

今、VS 2005 Expressを使用していますが、この警告については何をすべきか分かりません。私はprintf()の後にgetch()を使用する必要があります。エラーメッセージやキーヒットを必要とするものがあります。

あなたは私を助けることができますか?

+3

エラーメッセージを読みましたか? – jalf

+2

@ jalf:「エラーメッセージ」は間違っている/誤解を招くので、それを読むことがどのように役立つかわかりません。 –

+12

@R ..:そうではありません。コンパイラが警告を発行する理由を明示しており、警告を避ける*ように明示的に述べています。あなたと私は、標準機能を「非推奨」とするマイクロソフトの一方的な決定に同意しないかもしれませんが、その根拠に同意するかどうかにかかわらず、警告を消して、警告が実際に「代わりにこの機能を使用してください」と言うと、警告を読むことは確かに役立ちます。 – jalf

答えて

23

マイクロソフトでは、プログラマーが選択できるように名前が予約されているため、アンダースコアを付けずに名前にマークすることにしました。実装固有の拡張では、CまたはC++標準に準拠したい場合は、グローバル名前空間のアンダースコアで始まる名前を使用するか、POSIX/ANSI/ISO Cなどの標準準拠環境としてマークする必要があります。これらの基準の1つに対応しています。

Read this answer about getcwd()も、非常にうまく物事を知っているP. J. Plaugerの説明のとおりです。

ユーザーが入力したキーを待つだけの場合は、実際にgetcharを使用しない理由はありません。しかし、時には_getchとお友達を使用する方が、より実用的で便利な場合もあります。ただし、これらはCまたはC++標準では指定されていないため、プログラムの移植性が制限されます。心に留めておきます。

+0

実際にgetcharとgetchには違いがあります。いくつかのキーが押されるまでブロックをブロックします。 enterが押されるまでgetcharブロックを実行します。 –

2

なぜこれが必要ですか?あなたは単一の文字をキャプチャする必要がある場合getchar()を使用してみませんか?

+9

getcharはバッファされた行です。したがって、改行文字を待ちます。 _getch()は実行されませんが、ただちに戻ります。私は彼を理解することができますが、時には本当に便利です(例えば、「xを押してズームする」など)。 –

+1

私はそれがバッファリングとは関係ないと思います。 getchar()は一度に1文字ずつ読み込みます。 fgetsとXscanf()関数のすべての範囲があります(使用するのは難しいですが)。しかし、私が言ったように、適切ではない文脈、特に非標準の拡張を提案するのは難しいです。 – dirkgently

9

あなたがC++を使っているのなら、なぜprintfgetchでしょうか?代わりにcoutcin.getを使用することを検討してください。

+0

cin/cing.getが矢印キーで動作するかわかりません – tagoma

3

エラーが示すように、getch()という名前は(Microsoft固有の拡張機能のように)推奨されておらず、代わりに_getch()をお勧めします。 POSIXがどこに入っているのか分かりません。 POSIXではgetch()が定義されていませんが、代わりにISO C standardで指定されているようにgetchar()が含まれています(298ページ、最終標準がフリーではないため、リンク先の草案)。その解決策は、提案された通りに行うことであり、_getch()を使用するか、標準C getchar()を使用することです。代わりに、getchはの

+1

'getch'は' getchar'とほとんど関係がありません。むしろ、それはバッファリング/遅延なしでキーボードから1文字を対話的に読むことを目的とした、conio(そして私はcursesとも言える)インターフェースです。 –

+0

この特定の関数の場合、POSIXには入っていませんが、アンダースコアバージョンのために推奨されなくなった関数のほとんどは、 'open'や' mkdir'のようなPOSIXのような関数でした。彼らはほんのわずかな例外を除いて別々の警告メッセージを作成することを嫌っていたと思います。 –

4

使用_getch()()

+2

なぜあなたは質問者がもう1人の代わりに1人を使用すべきか説明できますか?問題を解決することは良いことですが、問題を理解して、ソリューションがなぜ機能するのがさらに優れていますか。 – MCeley

関連する問題