【问题标题】:PCH Warning: header stop cannot be in a macro or #if block - Visual C++ 2010 Express SP1PCH 警告:标题停止不能在宏或 #if 块中 - Visual C++ 2010 Express SP1
【发布时间】:2011-08-25 14:33:03
【问题描述】:

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

框架.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 中有什么内容?显示代码。
  • 那是哪个文件?你使用预编译头文件吗?因为这就是 PCH 的含义。你有 StdAfx.h 文件吗?我们可能需要查看您的整个包含图片以了解错误来自何处。似乎某处有一个未封闭的#if 块。
  • 顺便说一句,如果 Framework.h 包含预编译头文件,那很可能是错误。尝试将其包含移动到 #if/#endif 标头保护之外(或使用 #pragma 一次),看看会发生什么。
  • 这里没有预编译的头文件。请参阅 Framework.h 的编辑
  • 这里没有包含 AppState.h 的文件,否则我会显示它!从进一步的谷歌搜索来看,这是 Visual Studio 中的一个错误,但如果包含在 cpp 文件中,则只要有问题的标头就可以解决,这将是。如果你有兴趣,这里有人比我和微软的回复更好地描述了这个问题:connect.microsoft.com/VisualStudio/feedback/details/651405/…

标签: c++ visual-c++


【解决方案1】:

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

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

【讨论】:

  • 这对我也有用,谢谢。知道根本问题是什么吗?
  • @MarkStorer 上一篇文章的链接有最好的解释http://connect.microsoft.com/VisualStudio/feedback/details/651405/pch-warning-after-installing-sp1 - Intellisense 引擎对带有标头停止且不包含在任何 .c/.cpp 文件中的头文件不满意。跨度>
  • @Kash 链接已失效。
  • 赞成,但我个人不想用#pragma onces 替换我的包含防护。然后我再次关闭并重新打开文件,它为我解决了问题。
【解决方案2】:

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

【讨论】:

  • 不,我没有使用它,也没有预编译的头文件。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            我刚刚向头文件 (#include "header.h") 添加了一个引用,它有所帮助。

            【讨论】:

            • 是的,正如上面 Kash 的comment 所述,这可以解决问题。
            【解决方案9】:

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

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

                【解决方案11】:

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

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

                解决方案是在项目属性、配置属性、C/C++、预处理器、预处理器定义下定义以下宏:

                __asm(x)=
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-10-13
                  • 1970-01-01
                  • 2012-06-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多