Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从包含中定义打破以前的其他包含_C++_C Preprocessor - Fatal编程技术网

C++ 从包含中定义打破以前的其他包含

C++ 从包含中定义打破以前的其他包含,c++,c-preprocessor,C++,C Preprocessor,我正在尝试调试项目主文件的include。这是我的包含代码 //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 #

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

//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"
下面是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];
762 |枚举脚本回调
763| {
764 |初始化=0,
...
768 |调整大小|事件,
769 |关键事件,
770 |鼠标|事件,
771 |触碰|事件,
...
775 | GAMEPAD_活动,
776 |回调|计数,
777 |无效的_回调=回调_计数
778| };
...
1024 | std::vector _回调[回调计数];

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

  • 定义影响
    windows.h
    的任何宏,例如
    WIN32\u LEAN\u和\u MEAN
  • 如果使用,
    #是否包括
    ,以及
    #是否包括
  • 是否在任何恼人的宏上执行
    #undef

  • 然后确保可能遇到Windows include的每个源文件都包含此头文件。您可能可以使用编译器功能将标题注入所有单元。

    我在编译过程中出错
    然后发布错误!呜呜,我会在30分钟后回家。如果枚举本身是在
    windows.h
    之前定义的,那么它显然不能破坏枚举本身,因为
    KEY\u EVENT
    MOUSE\u EVENT
    尚未定义。但是,在包含了
    windows.h
    之后,如果不使用
    #unde
    语句,任何对enum的使用都会中断,这应该可以很好地处理问题。因此我不得不认为,在定义枚举之前,
    windows.h
    很可能比您想象的更早被包括进来。为什么不先在顶部包含
    windows.h
    ,然后在顶部包含
    #unde
    ,然后根据需要包含其余的文件?因为无论我将gameplay.h按顺序移动到哪里,我仍然会遇到问题。我不知道为什么。啊,发现了问题。我更仔细地观察了编译过程,意识到它实际上在编译完这个文件之后就停止了。该文件包括RakNet,其中包括windows.h,之后包括gameplay.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];