2010-07-16 168 views
0

奇怪的編譯錯誤我昨天從Visual Studio切換到Code :: Blocks,只是有一些奇怪的編譯器錯誤消息。Code :: blocks

我包括windows.h,我可以使用所有的API調用就好,如創建窗口類和創建窗口/按鈕和東西。但是,當我試圖把一些按鍵與SendInput(),我得到了這兩個聲明的錯誤消息:

INPUT ip; 
KEYBDINPUT kbi; 

編譯器錯誤:

C:\code_blocks\test-app\main.cpp|21|error: 'INPUT' was not declared in this scope| 
C:\code_blocks\test-app\main.cpp|22|error: 'KEYBDINPUT' was not declared in this scope| 

我甚至可以右鍵單擊KEYBDINPUTINPUT structors和點擊「查找聲明」,它發現它在「winuser.h」(它在裏面),但它仍然給我這些錯誤消息,他們沒有聲明。

此代碼在VS中正常工作,只包含windows.h。我正在使用GNU GCC編譯器。

+0

您確定您的課程或CPP文件已正確包含該標題嗎?否則,它不知道符號INPUT和KEYBDINPUT是什麼意思。 – 2010-07-16 19:38:01

+0

是的,因爲我可以使用windows.h/winuser.h中的其他函數和聲明,但是這兩個在winuser.h中的結構體聲明它們沒有聲明,但它們是!我可以在winuser.h中看到它們:/ – Kaije 2010-07-16 19:39:51

+0

「我從Visual Studio切換到Code :: Blocks」 - 爲什麼你會這樣做? :P – Cogwheel 2010-07-16 19:41:51

回答

2

我認爲你需要的預處理器指令(Visual Studio中可能已經添加的話):

你有什麼_WIN32_WINNT定義爲?

也許你可以添加:

#ifndef _WIN32_WINNT 
#define _WIN32_WINNT 0x0400 
#endif 

,或者你可以把它作爲你的編譯序列的一部分添加到您的預處理器指令。任何好的編譯器都會擁有它。

如果仍然不起作用,請刪除包含防護並直接定義它。也許它正在其他地方定義。

一些編譯器將在預處理器指令設置有這樣的:WIN32,_DEBUG,_CONSOLE,_MBCS,_WIN32_WINNT=0x0400

+0

使用任何發現的#define良好WINVER的0x0400在windef.h中找到,它位於windows.h中,然後#define _WIN32_WINNT WINVER我注意到我在winuser.h中根本不能使用任何東西 – Kaije 2010-07-16 20:23:53

+0

最後,你讓我在正確的軌道上,我將WINVER定義爲0x0400,但是它仍然沒有工作,但後來嘗試0x0500,它的工作......謝謝。 – Kaije 2010-07-16 20:42:32

+0

太棒了!很高興你解決它 – 2010-07-16 21:26:59

1

爲了詳細說明調包的答案,如果你看看在說KEYBDINPUT的文件,你會看到,靠近底部有一個表最小支持的OS版本。 VC++將_WIN32_WINNT設置爲比MinGW/GCC更新的版本(我猜測它是您使用Code :: Blocks的編譯器),這可能是您遇到此問題的原因。

此宏的目的是爲了防止您無意中使用與最低預期目標操作系統不兼容的API。

Windows API頭文件使用了許多與版本相關的宏。詳情可查詢here