#includes的问题

时间:2010-10-07 20:18:55

标签: c++ include

我以为我可以使用#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();
};

编译器没有看到AguiWidgetBase的AguiBaseTypes。这会导致

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,而不是随着时间的推移会混淆的个别包含?

由于

2 个答案:

答案 0 :(得分:3)

(Milo的详细说明)

你有相互包容或循环包含,你需要打破这些周期,否则你永远不会得到编译代码。

我可以从AguiWidgetBase.h看到它从AguiBaseTypes.h引用AguiColor,但是两个头都试图包含Agui.h,而Agui.h本身试图包含其他两个。

您应该重新整理标题,以便他们只#include他们想要的标题。

你应该有一个分层系统:

AguiWidgetBase.h应包括:

  • AguiBaseTypes.h

AguiBaseTypes.h应包括:

  • <string>

Agui.h可以包含您喜欢的任何内容,并且可以包含在您的应用程序模块中。

此外,您应该参考Pragma_once了解有关#pragma一次的更多信息并包含警卫。

答案 1 :(得分:2)

并不保证所有编译器都支持

#pragma once,而是使用include guard。此外,你有循环包括:“Agui.h”包括“AguiBaseTypes.h”,反之亦然。这不是它的意思。

全局包含文件可能可以减少源文件中的样板代码,但在头文件中,您应该包含完全必要的标题,否则就会出现您所描述的问题。