Code :: blocks
问题描述:
奇怪的编译错误我昨天从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|
我甚至可以右键单击KEYBDINPUT
和INPUT
structors和点击“查找声明”,它发现它在“winuser.h”(它在里面),但它仍然给我这些错误消息,他们没有声明。
此代码在VS中正常工作,只包含windows.h。我正在使用GNU GCC编译器。
答
我认为你需要的预处理器指令(Visual Studio中可能已经添加的话):
你有什么_WIN32_WINNT
定义为?
也许你可以添加:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
,或者你可以把它作为你的编译序列的一部分添加到您的预处理器指令。任何好的编译器都会拥有它。
如果仍然不起作用,请删除包含防护并直接定义它。也许它正在其他地方定义。
一些编译器将在预处理器指令设置有这样的:WIN32,_DEBUG,_CONSOLE,_MBCS,_WIN32_WINNT=0x0400
答
为了详细说明调包的答案,如果你看看在说KEYBDINPUT的文件,你会看到,靠近底部有一个表最小支持的OS版本。 VC++将_WIN32_WINNT设置为比MinGW/GCC更新的版本(我猜测它是您使用Code :: Blocks的编译器),这可能是您遇到此问题的原因。
此宏的目的是为了防止您无意中使用与最低预期目标操作系统不兼容的API。
Windows API头文件使用了许多与版本相关的宏。详情可查询here
您确定您的课程或CPP文件已正确包含该标题吗?否则,它不知道符号INPUT和KEYBDINPUT是什么意思。 – 2010-07-16 19:38:01
是的,因为我可以使用windows.h/winuser.h中的其他函数和声明,但是这两个在winuser.h中的结构体声明它们没有声明,但它们是!我可以在winuser.h中看到它们:/ – Kaije 2010-07-16 19:39:51
“我从Visual Studio切换到Code :: Blocks” - 为什么你会这样做? :P – Cogwheel 2010-07-16 19:41:51