2009-05-02 466 views
12

某處在某些時間,我在大學裏做了一些C和C++,但我沒有多少注意C++。現在我想要注意一些C++,但是當我使用getch()函數時,我會從下面看到警告。getch已棄用

警告C4996:'getch':此項目的POSIX名稱已被棄用。相反,使用ISO C++一致性名稱:_getch。詳細信息請參見在線幫助。

現在,我正在使用VS 2005 express,並且我不知道該如何處理此警告。我需要在printf()之後使用getch()發送錯誤消息或其他需要按鍵命中的內容。

你能幫我嗎?

+3

您是否閱讀過錯誤消息? – jalf 2009-05-02 15:09:15

+2

@jalf:「錯誤信息」是錯誤的/誤導性的,所以我沒有看到如何讀取它會有所幫助... – 2011-09-14 22:32:41

+12

@R ..:不,它不是。它非常清楚地說明了編譯器發佈警告的原因,並且清楚地表明瞭他們希望你做什麼來避免警告。您和我可能不同意微軟單方面決定「棄用」標準功能,但警告非常清楚地解釋了這個問題,無論您是否同意其基本推理。如果你想讓警告消失,並且警告實際上說「請使用此功能」,那麼閱讀警告肯定會有所幫助。 – jalf 2011-09-14 22:37:42

回答

23

微軟決定在沒有下劃線的地方標記名字,因爲這些名字是爲程序員選擇的。如果特定於擴展名的擴展名符合C或C++標準,則應該在全局名稱空間中使用以下劃線開頭的名稱 - 或者它們應該將自己標記爲組合的標準兼容環境,例如POSIX/ANSI/ISO C,其中這樣的函數然後對應於那些標準之一。

請閱讀this answer about getcwd()對於P.J.Plauger的解釋,當然他知道的東西非常好。

如果您只想等待用戶鍵入的某些鍵,那麼確實沒有理由不使用getchar。但有時用戶使用_getch和朋友更方便實用。但是,這些不是由C或C++標準指定的,因此會限制程序的可移植性。記住這一點。

2

爲什麼你需要這個?如果您需要捕捉單個字符,爲什麼不使用getchar()

+9

getchar是行緩衝的,因此它將等待換行符。 _getch()不會,但立即返回。我可以理解他,有時它真的很有用(例如,「按x放大」)。 – 2009-05-02 15:04:31

+1

我不認爲它與緩衝有什麼關係。 getchar()一次讀入一個字符。然後是fgets和Xscanf()函數的整個範圍(雖然很難使用)。但正如我所說,如果沒有適當的背景,特別是非標準的延伸,就很難提出建議。 – dirkgently 2009-05-02 15:10:03

9

如果你使用C++,爲什麼printfgetch?考慮使用coutcin.get來代替。

3

正如錯誤所述,名稱getch()已棄用(因爲這是Microsoft特定的擴展名),建議使用_getch()。我不確定POSIX在哪裏進入; POSIX沒有定義getch(),而是包含getchar(),如ISO C standard(第298頁,草案鏈接到因爲最終標準不是免費的)所指定的。解決辦法是按照建議使用_getch()或使用標準C getchar()

4

使用_getch()代替getch()