PCH警告:标头停止不能在宏或#if块中 - Visual C ++ 2010 Express SP1

时间:2011-05-14 17:32:38

标签: c++ visual-c++

这是从一个可能正在运作的网站粘贴的。我做了一些谷歌搜索,发现我现在的问题是我今天下载的Visual C ++ 2010 SP1的结果,现在给我这个错误:

PCH Warning: header stop cannot be in a macro or #if block.

希望有人能够帮助我!

#ifndef APP_STATE_H
#define APP_STATE_H

#include "Framework.h"

class AppState; //this line is giving me the error

//define two classes

#endif

Framework.h:

#ifndef OGRE_FRAMEWORK_H
#define OGRE_FRAMEWORK_H

#include <OgreCamera.h>
#include <OgreEntity.h>
#include <OgreLogManager.h>
#include <OgreOverlay.h>
#include <OgreOverlayElement.h>
#include <OgreOverlayManager.h>
#include <OgreRoot.h>
#include <OgreViewport.h>
#include <OgreSceneManager.h>
#include <OgreRenderWindow.h>
#include <OgreConfigFile.h>

#include <OISEvents.h>
#include <OISInputManager.h>
#include <OISKeyboard.h>
#include <OISMouse.h>

class OgreFramework : public Ogre::Singleton<OgreFramework>,OIS::KeyListener,OIS::MouseListener{
public:
    OgreFramework();
    ~OgreFramework();

    bool initOgre(Ogre::String wndTitle, OIS::KeyListener *pKeyListener = 0, OIS::MouseListener *pMouseListener = 0);
    void updateOgre(double timeSinceLastFrame);

    //OIS
    bool keyPressed(const OIS::KeyEvent &keyEventRef);
    bool keyReleased(const OIS::KeyEvent &keyEventRef);
    bool mouseMoved(const OIS::MouseEvent &evt);
    bool mousePressed(const OIS::MouseEvent &evt, OIS::MouseButtonID id);
    bool mouseReleased(const OIS::MouseEvent &evt, OIS::MouseButtonID id);

    Ogre::Root* mRoot;
    Ogre::RenderWindow* mRenderWnd;
    Ogre::Viewport* mViewport;
    Ogre::Log* mLog;
    Ogre::Timer* mTimer;

    //OIS
    OIS::InputManager* mInputMgr;
    OIS::Keyboard* mKeyboard;
    OIS::Mouse* mMouse;
private:
    OgreFramework(const OgreFramework&);
    OgreFramework& operator= (const OgreFramework&);
};

#endif

12 个答案:

答案 0 :(得分:86)

我有同样的问题,正在寻找解决方案。以下为我工作:

在文件开头添加#pragma once(甚至在#ifndef APP_STATE_H标头后卫之前)

答案 1 :(得分:13)

您可能使用了项目模板来开始并丢弃了预先生成的源代码文件。那些项目模板喜欢打开预编译的头文件,因为它可以节省时间。在“解决方案资源管理器”窗口中,右键单击项目,“属性”,“C / C ++”,“预编译标题”。将“预编译标题”设置更改为“不使用”。

答案 2 :(得分:4)

将#include语句移到#if #end块

之外

答案 3 :(得分:4)

1.关闭项目。 2.重新打开项目,一切都好。 这是我的经历。

答案 4 :(得分:3)

重建IntelliSense数据库解决了这个问题。

  1. 关闭Visual Studio
  2. 删除 [SolutionName] .sdf
  3. 删除 DllWrappers.opensdf
  4. 删除 ipch 文件夹
  5. 打开Visual Studio

答案 5 :(得分:2)

我遇到了同样的问题。我的解决方案是添加一个缺失的';'在类定义的最后。虽然这似乎不适用于您的问题,但是其他来这里遇到相同错误的人可能会觉得这有用。

答案 6 :(得分:1)

这可能是晚了一天和一美元短,但是当我不小心将我的头文件放在.cpp文件而不是.h文件中时,我遇到了同样的错误。我会发布它,以防它可以帮助某人。

答案 7 :(得分:1)

我刚刚添加了对头文件的引用(#include“header.h”)并且它有所帮助。

答案 8 :(得分:1)

我发现我的.h文件实际上被视为.cpp文件!右键单击解决方案资源管理器中的文件&gt;所有配置&gt;项目类型:C / C ++标题

确保项目类型不是C / C ++编译器或其他。

答案 9 :(得分:0)

添加.cpp文件并使其包含标题后,此错误应该消失。我读过一些其他的地方,这是一个错误。

答案 10 :(得分:0)

我使用Visual Studio编辑Linux项目。对我来说,当我在预编译的头文件中包含string.h时,便出现了问题。它是由具有__asm语句的行引起的,例如:

__THROW __asm ("memchr") __attribute_pure__ __nonnull ((1));

解决方案是在“项目属性”,“配置属性”,“ C / C ++”,“预处理程序”,“预处理程序定义”下定义以下宏:

__asm(x)=

答案 11 :(得分:-1)

当我这样做时,这发生在我身上:

文件a.h:

#include "b.h"
.
.
.

文件b.h:

#include "a.h"
.
.
.