定义从包括打破其他先前包括

时间:2014-08-28 23:53:20

标签: c++ c-preprocessor

我正在尝试调试项目主文件的包含。这是我的包含代码。

//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];

1 个答案:

答案 0 :(得分:1)

为避免与windows.h定义发生冲突,我建议您制作自己的头文件:

  1. 定义影响windows.h的所有宏,例如WIN32_LEAN_AND_MEAN
  2. #include <winsock2.h>是否使用,#include <windows.h>
  3. 在任何烦人的宏上#undef
  4. 然后确保可能遇到的每个源文件都包含此标头。您也许可以使用编译器功能将标头注入所有单元。