Предупреждение PCH: остановка заголовка не может быть в блоке макроса или #if - Visual C ++ 2010 Express SP1 - PullRequest
67 голосов
/ 14 мая 2011

Это вставлено с веб-сайта, который предположительно работал. Я немного погуглил и обнаружил, что проблема, с которой я столкнулся, является результатом 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 ]

86 голосов
/ 07 июня 2011

У меня была та же проблема, и я искал решение.Для меня сработало следующее:

Добавить #pragma once в начале файла (даже до защиты заголовка #ifndef APP_STATE_H)

15 голосов
/ 14 мая 2011

Вы, вероятно, использовали шаблон проекта, чтобы начать работу и выбросили предварительно сгенерированные файлы исходного кода. Эти шаблоны проектов любят включать предварительно скомпилированные заголовки, потому что это экономит время. Щелкните правой кнопкой мыши свой проект в окне обозревателя решений, Свойства, C / C ++, Предварительно скомпилированные заголовки. Измените настройку «Предварительно скомпилированный заголовок» на «Не используется».

5 голосов
/ 09 декабря 2014

1.Закройте проект.2. Откройте проект, и все в порядке.это мой опыт.

5 голосов
/ 07 июля 2014

переместить операторы #include за пределы блока #if #end

3 голосов
/ 13 ноября 2014

Восстановление базы данных IntelliSense решает проблему.

  1. Закрыть Visual Studio
  2. Удалить [SolutionName] .sdf
  3. Удалить DllWrappers.opensdf
  4. Удалить ipch папка
  5. Открыть Visual Studio
2 голосов
/ 17 апреля 2015

У меня была такая же проблема.Мое решение состояло в том, чтобы добавить пропущенный ';'в конце определения класса.Хотя это, похоже, не относится к вашей проблеме, другим, кто пришел сюда с той же ошибкой, может оказаться полезным

1 голос
/ 01 августа 2014

Я обнаружил, что мой файл .h фактически обрабатывается как файл .cpp! Щелкните правой кнопкой мыши файл в обозревателе решений> Все конфигурации> Тип элемента: заголовок C / C ++

Убедитесь, что тип элемента не является компилятором C / C ++ или другим.

1 голос
/ 23 июня 2014

Я только что добавил ссылку на файл заголовка (#include "header.h"), и это помогло.

1 голос
/ 07 июля 2012

Это вероятно на день позже и на доллар, но у меня возникла та же ошибка, когда я случайно поместил свой заголовочный файл в файл .cpp вместо файла .h. Я опубликую это, хотя в случае, если это может помочь кому-то.

0 голосов
/ 14 мая 2019

Я использую Visual Studio для редактирования проектов Linux. Для меня проблема присутствовала, когда я включал string.h в мой предварительно скомпилированный заголовочный файл. Это было вызвано строками с оператором __asm, например:

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

Решением было определить следующий макрос в свойствах проекта, свойства конфигурации, C / C ++, препроцессор, определения препроцессора:

__asm(x)=
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...