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


70

这是从可能正在运行的网站粘贴的。我进行了一些谷歌搜索,发现我现在遇到的问题是我今天下载的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

里面有什么Framework.h?显示代码。
纳瓦兹(Nawaz)

1
那是哪个文件 您是否使用预编译头?因为那是PCH所代表的。您有StdAfx.h文件吗?我们可能需要查看您的整个包含图片,以了解错误的来源。似乎某个地方有一个未封闭的#if块。
波亚兹·亚尼夫

顺便说一句,如果Framework.h包含预编译头,则很可能是错误。尝试将其包含移至#if /#endif标头防护之外(或一次使用#pragma),然后看看会发生什么。
波亚兹·亚尼夫

这里没有预编译的头文件。参见对Framework.h的编辑
pighead10 2011年

2
这里没有包含AppState.h的文件,否则我会显示它!从进一步的谷歌搜索来看,这是Visual Studio中的一个错误,但是只要有问题的标头(如果包含在cpp文件中)就会得到解决。如果你有兴趣,这里的人谁介绍的问题比我和微软的回应:connect.microsoft.com/VisualStudio/feedback/details/651405/...
pighead10

Answers:


92

我遇到了同样的问题,正在寻找解决方案。以下对我有用:

#pragma once在文件的开头添加(甚至在#ifndef APP_STATE_H标题保护之前)


这对我也有用,谢谢。知道潜在的问题是什么吗?
Mark Storer 2012年

13
@MarkStorer上一篇文章的以下链接具有最佳解释http://connect.microsoft.com/VisualStudio/feedback/details/651405/pch-warning-after-installing-sp1-Intellisense引擎对带有标头停止,不包含在任何.c / .cpp文件中。
卡什(Kash)2012年

3
@Kash链接已死。
kayleeFrye_onDeck

1
赞成,但我个人不想将#pragma onces替换为include卫队。然后我再次关闭并重新打开文件,它为我解决了问题。
Marc.2377'9

15

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


3
不,我没有使用它,也没有预编译的头文件。
pighead10 2011年

6

1.关闭项目。2.重新打开项目,一切正常。这是我的经验。



3

重建IntelliSense数据库即可解决该问题。

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

3

我有同样的问题。我的解决方案是添加一个缺失的';' 在类定义的末尾。尽管这似乎不适用于您的问题,但其他人也遇到相同的错误,可能会发现此问题很有帮助。


1

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


1

我只是在头文件(#include“ header.h”)中添加了引荐,它对您有所帮助。


是的,正如上面Kash的评论中所述,这可以解决问题。
克里斯·琼斯

1

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

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


0

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


0

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

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

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

__asm(x)=
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.