70 votes

Avertissement PCH : l'arrêt de l'en-tête ne peut pas être dans une macro ou un bloc #if - Visual C++ 2010 Express SP1

Ceci est collé à partir d'un site web, qui vraisemblablement fonctionnait. J'ai fait quelques recherches sur Google et j'ai trouvé que le problème que j'ai maintenant est le résultat de Visual C++ 2010 SP1, que j'ai téléchargé aujourd'hui, et qui me donne maintenant cette erreur :

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

J'espère que quelqu'un pourra m'aider à ce sujet !

#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

0 votes

Ce qui se trouve dans le Framework.h ? Montrer le code.

1 votes

Quel est ce fichier ? Et utilisez-vous Precompiled Headers ? Parce que c'est la signification de PCH. Vous avez un fichier StdAfx.h ? Nous avons probablement besoin de voir l'ensemble de votre include pour comprendre d'où vient l'erreur. Il semble qu'il y ait un bloc #if non verrouillé quelque part.

0 votes

BTW, si Framework.h inclut l'en-tête précompilé, cela peut très bien être l'erreur. Essayez de déplacer son inclusion en dehors de la garde de l'en-tête #if/#endif (ou utilisez un #pragma once à la place) et voyez ce qui se passe.

94voto

Kash Points 716

J'ai eu le même problème et je cherchais une solution. Ce qui suit a fonctionné pour moi :

Añadir #pragma once au début du fichier (même avant la balise #ifndef APP_STATE_H garde d'en-tête)

0 votes

Ça a marché pour moi aussi, merci. Une idée de ce qu'est le problème sous-jacent ?

14 votes

@MarkStorer Le lien suivant d'un message précédent donne la meilleure explication. http://connect.microsoft.com/VisualStudio/feedback/details/651405/pch-warning-after-installing-sp1 - Le moteur Intellisense n'était pas satisfait des fichiers d'en-tête avec un arrêt d'en-tête et non inclus dans les fichiers .c/.cpp.

3 votes

Le lien @Kash est mort.

15voto

Hans Passant Points 475940

Vous avez probablement utilisé un modèle de projet pour commencer et jeté les fichiers de code source pré-générés. Ces modèles de projet aiment activer les en-têtes précompilés car ils permettent de gagner du temps. Cliquez avec le bouton droit de la souris sur votre projet dans la fenêtre de l'explorateur de solutions, Propriétés, C/C++, En-têtes précompilés. Changez le paramètre "En-tête précompilé" en "Non utilisé".

3 votes

Non, je ne l'ai pas utilisé et il n'y a pas d'en-têtes précompilés.

3voto

Nour Points 21

Déplacer les déclarations #include en dehors du bloc #if #end

1voto

doug Points 96

C'est probablement un jour en retard et un dollar en moins, mais j'ai eu la même erreur lorsque j'ai accidentellement placé mon fichier d'en-tête dans un fichier .cpp au lieu d'un fichier .h. Je vais quand même le poster au cas où cela aiderait quelqu'un. Je vais quand même le poster au cas où il pourrait aider quelqu'un.

1voto

Ilan Points 1

J'ai juste ajouté une référence au fichier d'en-tête (#include "header.h") et cela a aidé.

0 votes

Oui, comme indiqué dans l'article de Kash commentaire ci-dessus, cela peut régler le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X