2010-10-07 119 views
0

我以爲我可以使用#pragma一次來解決我的問題,但它不起作用。#包含的問題

這是我的問題。

我有Agui.h,我想是我的主頭這一切包括: 這是它:

#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看起來是這樣的:

#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(); 
}; 

和問題一,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(); 
}; 

編譯器沒有看到AguiB AguiWidgetBase的aseTypes。這導致

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 

我該如何解決這個問題?還有一種方法可以像我想要的那樣做到這一點,在哪裏隨處可見Agui.h,而不是隨着時間的推移會變得混亂的單個包含?

感謝

+0

包含的.cpp文件導致錯誤的順序是什麼?您還可以使用user/showIncludes查看包含樹,並找出標題被拖入的順序... – Nick 2010-10-07 20:27:11

+0

回滾到原始版本以查看頭文件中的依賴關係。 – quamrana 2010-10-07 21:25:21

回答

2

#pragma once並不保證在所有編譯器上都支持,而是使用包含保護。此外,你有循環包括:「Agui.h」包括「AguiBaseTypes.h」,反之亦然。這不是它的本意。

全局包含文件可能是正確的,以減少在源文件中的樣板代碼,但在頭文件,你應該包括完全必要的標頭,否則,你得到你所描述的問題。

+1

#pragma在大多數編譯器上都很好。它們在Visual Studio,GCC,CLang和我使用的控制檯編譯器上得到了正確支持。雖然AndiDog說他們不能得到支持是正確的,但實際上他們是所有流行的現代編譯器。 – Cthutu 2010-10-07 20:43:06

3

(精對米洛)

你有相互包容或環狀的包括你需要打破這些週期或你將永遠不會獲得代碼進行編譯。

我可以從AguiWidgetBase.h看到它引用了AguiBaseTypes.h中的AguiColor,但兩個頭文件都試圖包含Agui.h,而Agui.h本身試圖包含其他兩個頭文件。

,使他們只#include的那些他們想你應該重新組織的頭。

你應該有一個分層系統,以便:

AguiWidgetBase.h應包括:

  • AguiBaseTypes.h

AguiBaseTypes.h應包括:

  • <string>

Agui.h可以包括任何你喜歡的,可以通過將應用程序模塊被包括在內。

此外,您應該參考Pragma_once瞭解#pragma一次的更多信息,幷包含警衛。

+0

我不確定我完全理解,你能否詳細說明一下? – jmasterx 2010-10-07 20:28:24

+0

哪些位不理解? – quamrana 2010-10-07 20:37:51