我正在尝试调试项目主文件的包含。这是我的包含代码。
//Gameplay
#include "gameplay.h"
//LibNoise
#include <noise/noise.h>
//Console Window
#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef KEY_EVENT
#undef MOUSE_EVENT
#endif
#include <io.h>
#include <fcntl.h>
//RakNet
#include "MessageIdentifiers.h"
#include "RakPeerInterface.h"
#include "BitStream.h"
#include "RakNetTypes.h"
//My Includes
#include "Island.h"
问题是,gameplay.h包含一个文件(特别是ScriptController.h),其中有一个包含单词KEY_EVENT和MOUSE_EVENT的枚举,它包含在windows.h中的一些包含(特别是wincon.h)。这打破了枚举,我在编译过程中遇到错误。注意,它实际上包括windows.h,因为根据MSVS,此时没有定义_WINDOWS_(所以它不像在gameplay.h之前定义的那样)。
我不明白为什么这会出现问题,因为在windows.h之前包含了gameplay.h,这应该意味着我可以毫不费力地更换枚举中的术语?取消定义它们也无济于事。
我哪里出错了?有没有什么办法可以“调试”预处理器,看看预处理器的输出导致了这种语法错误和某种#include链?我希望下次能够自己解决这个问题。
这是错误
错误3错误C2065:'CALLBACK_COUNT':未声明的标识符c:\ users \ pf \ downloads \ gameplay-master \ gameplay \ src \ scriptcontroller.h 1024 1 testerino2
错误1错误C2059:语法错误:'常量'c:\ users \ pf \ downloads \ gameplay- master \ gameplay \ src \ scriptcontroller.h 769 1 testerino2
错误2错误C3805:'常数':意外令牌,预期'}'或','c:\ users \ pf \ downloads \ gameplay-master \ gameplay \ src \ scriptcontroller.h 769 1 testerino2
这是wincon.h定义
#define KEY_EVENT 0x0001 // Event contains key event record
#define MOUSE_EVENT 0x0002 // Event contains mouse event record
以下是ScriptController.h的违规代码行
762| enum ScriptCallback
763| {
764| INITIALIZE = 0,
...
768| RESIZE_EVENT,
769| KEY_EVENT,
770| MOUSE_EVENT,
771| TOUCH_EVENT,
...
775| GAMEPAD_EVENT,
776| CALLBACK_COUNT,
777| INVALID_CALLBACK = CALLBACK_COUNT
778| };
...
1024| std::vector<std::string> _callbacks[CALLBACK_COUNT];
答案 0 :(得分:1)
为避免与windows.h
定义发生冲突,我建议您制作自己的头文件:
windows.h
的所有宏,例如WIN32_LEAN_AND_MEAN
#include <winsock2.h>
是否使用,#include <windows.h>
#undef
然后确保可能遇到的每个源文件都包含此标头。您也许可以使用编译器功能将标头注入所有单元。