getch sleep 函式的正確用法

2021-07-24 22:28:51 字數 2730 閱讀 1740

前段時間由於需要,寫了一段**,用到了函式 getch(),但是當時出錯了,提示該識別符號未被定義,一時無解。後來又有乙個朋友,問我怎麼將乙個字串中的字元以一種動態的方式進行輸出,我當時告訴他的是使用 sleep() 函式,也沒有細想,後來發現,根本不存在 sleep() 這個函式。這個糗可是出大發了!

在很多的官方的與非官方的教程中,getch() 都是定義在標頭檔案 stdlib.h 中的,甚至還有的說,是在 stdio.h 中。比如下面的例子:

#include 

void main()

看著好像很高深莫測的樣子,但是一看,嘿!getch() 函式可沒有在 stdio.h 裡面定義呢!

先不說別的,嘗試編譯,提示「test.cpp(5) : error c2065: 『getch』 : undeclared identifier」,看來果真不是在 stdio.h 裡。

那麼 getch() 到底定義在**呢?

通過閱讀 c++ 的標頭檔案,可以發現,在 conio.h 中定義了如下內容:

_crtimp int __cdecl _getch(void);
那我們現在再來試試,包含了 conio.h 檔案後,又是乙個怎麼樣的結果:

#include 

#include

void main()

嘗試編譯,成功通過。在 cmd 裡執行也通過。

看來,的確是盡信書不如無書。連教程都能出錯。現在我們乾掉了乙個 getch(),可還剩下乙個 sleep() 呢?前文說了,這個函式,在標頭檔案裡根本就不存在。那我們無論如何也是找不到這個函式的。不過,找不到它,我們還可以試著去找和它長的很像的其他的函式。

事實證明,在不借助網路,不借助 msdn 和其他任何操作手冊的情況下,找乙個函式最好的方法就是在標頭檔案所在的資料夾中用 find。

c:\program files\microsoft visual studio\vc98\include> find *.h 「sleep」 /i

共搜尋到如下結果:

//---------- mapiwin.h

void winapi sleep(dword dwmilliseconds);

//---------- stdlib.h

_crtimp void __cdecl _sleep(unsigned

long);

//---------- winbase.h

winbaseapi void winapi sleep(dword dwmilliseconds);

可見,mapiwin.h 和 winbase.h 中關於 sleep() 函式的定義實際上是一樣的。

測試過程我就略過了,當然我肯定是測試過,不過就不在這兒寫了,現在,貼上應用 stdlib.h 中的 _sleep() 的**。

//using _sleep() declared in stdlib.h

#include

#include

void main()

stdlib.h 中的 _sleep() 一帆風順,可是 winbase.h 中的 sleep() 卻有些不靠譜。經測試,在只包含 winbase.h 的情況下無法編譯成功。原因是一些自定義型別沒有定義,例如 dword 和 handle 一類。因為我檢視了 winbase.h 的內容,並沒有定義這些型別,也沒有包含含有這些型別的檔案。那麼現在該怎麼辦呢?

還記得有乙個標頭檔案 windows.h 嗎?在該檔案第 164 行(不同版本的可能有差別),有一處#include 「winbase.h」,而且顯然,windows.h 裡面定義了各種的資料型別(#include 「windef.h」),那麼包含 windows.h,是否能夠呼叫 sleep() 了呢?經測試,答案是肯定的。這裡就不詳述測試的過程了,直接貼**

//using sleep() declared in winbase.h

//including windows.h instead for more supportings.

#include

//#include

#include

void main()

看來,有些時候,不是定義了函式,就可以使用的。

不過,在這裡我還要多說一點是,雖然在實際的**中,我們 #include 的是 windows.h 檔案,但我們不能說 sleep() 就是 windows.h 中定義的。畢竟,它只是在 windows.h 中又包含了 winbase.h。

好了,來乙個文末總結——

getch() 函式定義在標頭檔案 conio.h 中,函式宣告為

_crtimp int __cdecl _getch(void);

_sleep() 函式定義在標頭檔案 stdlib.h 中,函式宣告為

_crtimp void __cdecl _sleep(unsigned long);

sleep() 函式定義在標頭檔案 winbase.h 中,不過使用的時候應包含的是 windows.h 標頭檔案而非 winbase.h,函式宣告為

winbaseapi void winapi sleep(dword dwmilliseconds);

正確放置inline函式

個人感覺用c 寫出的程式再小也小不到 去,不愧是開發大型專案的好手,呵呵。所以用c 寫出的程式一定要有個好的布局,也就是合理的標頭檔案原始檔設定 這是高手說的,哈哈 前幾天,自己在折騰c 的時候遇到了乙個及其鬱悶的事情 程式寫好了,編譯也通過了,可就是鏈結的時候總報找不到那個函式。整整折騰了我一下午...

正確使用memset函式

本文歸納了下使用memset幾個需要注意的地方,雖然內容很簡單,但也希望對大家有所幫助。1.memset是以位元組為單位,初始化記憶體塊。當初始化乙個位元組單位的陣列時,可以用memset把每個陣列單元初始化成任何你想要的值,比如,cpp view plain copy print char dat...

正確使用非同步函式的姿勢

原文 jakearchibald.com 2017 await 翻譯 瘋狂的技術宅 在編寫非同步函式時,await return與return await之間存在差異,選擇正確的處理方式非常重要。讓我們先從這個非同步函式開始 async function waitandmaybereject 複製 ...