2010-10-07 7 views
0

Je pensais pouvoir utiliser #pragma une seule fois pour résoudre mes problèmes, mais cela ne fonctionne pas.Problèmes aveC#includes

Voici mon problème.

Je Agui.h que je voulais être mon en-tête principal qui comprend tout: voici:

#pragma once 

/* 
    This header includes all the required headers 
    required for Agui 

     Author: Josh 
*/ 

//Standard library (STL) 

#include <stdlib.h> 
#include <iostream> 
#include <string> 
#include <sstream> 
#include <vector> 
#include <list> 
#include <algorithm> 
#include <queue> 

//C runtime 
#include <cmath> 
#include <ctime> 

//Allegro 5 
#include <allegro5/allegro.h> 
#include <allegro5/allegro5.h> 
#include <allegro5/allegro_image.h> 
#include <allegro5/allegro_primitives.h> 
#include <allegro5/allegro_font.h> 
#include <allegro5/allegro_ttf.h> 

#include "AguiBaseTypes.h" 
#include "AguiWidgetBase.h" 

AguiBaseTypes.h ressemble à ceci:

#pragma once 
#include "Agui.h" 
#define AguiBitmap ALLEGRO_BITMAP 

/* 
    This header contains classes for basic types. 
    These include: 
    Point, 
    Size, 
    Rectangle, 
    Color 
    and their floating equivalents 

     Author: Josh 
*/ 


//integer Point class 
class AguiPoint { 
    int x; 
    int y; 
public: 
    int getX(); 
    int getY(); 
    void setX(int x); 
    void setY(int y); 
    void set(int x, int y); 
    AguiPoint(int x, int y); 
    AguiPoint(); 
    std::string toString(); 
    std::string xToString(); 
    std::string yToString(); 

}; 

//floating version of Agui Point 
class AguiPointf { 
    float x; 
    float y; 
public: 
    float getX(); 
    float getY(); 
    void setX(float x); 
    void setY(float y); 
    void set(float x, float y); 
    AguiPointf(float x, float y); 
    AguiPointf(AguiPoint p); 
    AguiPointf(); 
    std::string toString(); 
    std::string xToString(); 
    std::string yToString(); 
}; 

//Integer rectangle class 
class AguiRectangle { 
    int x; 
    int y; 
    int width; 
    int height; 
public: 

    bool isEmpty(); 
    int getTop(); 
    int getLeft(); 
    int getBottom(); 
    int getRight(); 
    AguiPoint getTopLeft(); 
    AguiPoint getBottomRight(); 
}; 

class AguiColor { 
    unsigned char r; 
    unsigned char g; 
    unsigned char b; 
    unsigned char a; 
void verifyColorBounds(); 
public: 
    AguiColor(int r, int g, int b, int a); 
    AguiColor(float r, float g, float b, float a); 
    AguiColor(); 
    int getR(); 
    int getG(); 
    int getB(); 
    int getA(); 
}; 

et la problématique un, AguiWidgetBase.h

#pragma once 
#include "Agui.h" 



/* 
    This is the base class for all widgets 

     Author: Josh 
*/ 
class AguiWidgetBase 
{ 
    //variables 
    AguiColor tintColor; 
    AguiColor fontColor; 
    //private methods 
    void zeroMemory(); 
    virtual void onPaint(); 
    virtual void onTintColorChanged(AguiColor color); 
    void (*onPaintCallback)(AguiRectangle clientRect); 
    void (*onTintColorChangedCallback)(); 


public: 
    AguiWidgetBase(void); 
    ~AguiWidgetBase(void); 
    void paint(); 
    void setTintColor(AguiColor color); 
    AguiColor getBackColor(); 
}; 

Le compilateur ne voit pas AguiB aseTypes pour AguiWidgetBase. Cela provoque

Warning 13 warning C4183: 'getBackColor': missing return type; assumed to be a member function returning 'int' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 29 
Error 2 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 14 
Error 3 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 14 
Error 5 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 15 
Error 6 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 15 
Error 11 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 29 
Error 12 error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 29 
Error 1 error C2146: syntax error : missing ';' before identifier 'tintColor' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 14 
Error 10 error C2146: syntax error : missing ';' before identifier 'getBackColor' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 29 
Error 4 error C2146: syntax error : missing ';' before identifier 'fontColor' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 15 
Error 8 error C2061: syntax error : identifier 'AguiRectangle' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 20 
Error 7 error C2061: syntax error : identifier 'AguiColor' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 19 
Error 9 error C2061: syntax error : identifier 'AguiColor' c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\AguiWidgetBase.h 28 

Comment puis-je résoudre ce problème? Aussi est-il un moyen de le faire comme je veux où Agui.h est inclus partout, au lieu d'inclure individuels qui peuvent devenir confus au fil du temps?

Merci

+0

Quelle est l'ordre des includes pour le fichier .cpp qui provoque les erreurs? Vous pouvez également user/showIncludes pour voir l'arborescence include et déterminer l'ordre dans lequel les en-têtes sont extraits ... – Nick

+0

Revoir la version d'origine pour voir les dépendances dans les fichiers d'en-tête. – quamrana

Répondre

2

#pragma once n'est pas garanti d'être pris en charge sur tous les compilateurs, utilisez plutôt des gardes. De plus, vous avez inclus cyclique: "Agui.h" inclut "AguiBaseTypes.h" et vice versa. Ce n'est pas comme ça que ça doit être. Un fichier d'inclusion global peut être utile pour réduire le code standard dans les fichiers source, mais dans les fichiers d'en-tête, vous devez inclure exactement les en-têtes nécessaires, sinon vous obtenez le problème que vous avez décrit.

+1

#pragma une fois sont très bien sur la plupart des compilateurs. Ils sont pris en charge correctement sur Visual Studio, GCC, CLang et sur les compilateurs de consoles que j'utilise. Bien que AndiDog ait raison de dire qu'ils ne sont pas garantis, en pratique ils sont sur tous les compilateurs modernes populaires. – Cthutu

3

(élaboration pour Milo)

Vous avez compris mutuellement ou cyclique COMPREND et vous devez briser ces cycles ou vous ne serez jamais obtenir le code à compiler.

Je peux voir à partir AguiWidgetBase.h qu'il se réfère à AguiColor de AguiBaseTypes.h, mais les deux en-têtes essaient d'inclure Agui.h, et Agui.h lui-même essaie d'inclure les deux autres.

Vous devez réorganiser les en-têtes de manière à ce qu'ils ne contiennent que ceux qu'ils recherchent #include.

Vous devriez avoir un système hiérarchique si:

AguiWidgetBase.h devrait inclure:

  • AguiBaseTypes.h

AguiBaseTypes.h devrait inclure:

  • <string>

Agui.h peut inclure tout ce que vous aimez et peut être inclus par vos modules d'application.

De plus, vous devriez vous référer à Pragma_once pour plus d'informations sur #pragma une fois et inclure des gardes.

+0

Je ne suis pas sûr de bien comprendre, pourriez-vous élaborer? – jmasterx

+0

Quels bits ne comprenez-vous pas? – quamrana