code :: blocks出现奇怪的编译错误

时间:2010-07-16 19:34:19

标签: c++ c winapi

我昨天从Visual Studio切换到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结构并单击“查找声明”,它会在“winuser.h”(内部)中找到它,但它仍然在给我这些错误消息未声明它们。

此代码在VS中运行良好,只包含windows.h。我正在使用GNU GCC编译器。

2 个答案:

答案 0 :(得分:2)

我认为你需要预处理器指令(Visual Studio可能已经添加了它们):

你有_WIN32_WINNT定义为什么?

也许您可以添加:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif

或者您可以将它作为编译序列的一部分添加到预处理器指令中。任何好的编译器都会拥有它。

如果仍然无效,请移除包含防护并直接定义。也许它正在其他地方定义。

有些编译器会在预处理器指令设置中使用它:WIN32,_DEBUG,_CONSOLE,_MBCS,_WIN32_WINNT=0x0400

答案 1 :(得分:1)

要详细说明Changeling的答案,如果你看一下说KEYBDINPUT的文档,你会发现它附近有一个支持最低版本操作系统版本的表格。 VC ++将_WIN32_WINNT设置为比MinGW / GCC更高的版本(我猜测它是您使用Code :: Blocks的编译器),这可能是您遇到此问题的原因。

此宏的目的是防止您无意中使用与您的最低目标操作系统不兼容的API。

Windows API标头使用了许多与版本相关的宏。详细信息可以在here

找到