C++ 与#有关的问题包括

C++ 与#有关的问题包括,c++,include,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 <ios

我想我可以用一次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"
还有一个问题,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,而不是随着时间的推移会变得混乱的单个包含

谢谢

(为米洛精心制作)

您已经有了互斥或循环包含,您需要打破这些循环,否则您将永远无法编译代码

我可以从AguiWidgetBase.h中看到,它引用了AguiBaseTypes.h中的AguiColor,但这两个标题都试图包含Agui.h,而Agui.h本身则试图包含其他两个标题

您应该重新组织标题,使其仅包含所需的标题

您应该有一个分层系统,以便:

AguiWidgetBase.h应包括:

  • AguiBaseTypes.h
AguiBaseTypes.h应包括:

h可以包含您喜欢的任何内容,也可以包含在您的应用程序模块中

此外,您还应参考以了解有关“pragma once”和“include guard”的更多信息。

(Milo的详细说明)

您已经有了互斥或循环包含,您需要打破这些循环,否则您将永远无法编译代码

我可以从AguiWidgetBase.h中看到,它引用了AguiBaseTypes.h中的AguiColor,但这两个标题都试图包含Agui.h,而Agui.h本身则试图包含其他两个标题

您应该重新组织标题,使其仅包含所需的标题

您应该有一个分层系统,以便:

AguiWidgetBase.h应包括:

  • AguiBaseTypes.h
AguiBaseTypes.h应包括:

h可以包含您喜欢的任何内容,也可以包含在您的应用程序模块中

此外,有关“一次pragma和include-guard”的更多信息,请参阅。

\pragma-once
不保证在所有编译器上都受支持,请改用include-guard。此外,还有循环包含:“Agui.h”包含“AguiBaseTypes.h”,反之亦然。这不是我们想要的

全局include文件可以减少源文件中的样板代码,但在头文件中,您应该准确地包含必要的头文件,否则您会遇到您描述的问题。

#pragma一旦不能保证所有编译器都支持
,请改用include-guard。此外,还有循环包含:“Agui.h”包含“AguiBaseTypes.h”,反之亦然。这不是我们想要的


全局包含文件可以减少源文件中的样板代码,但在头文件中,您应该准确地包含必要的头文件,否则您会遇到您描述的问题。

导致错误的.cpp文件的包含顺序是什么?您还可以使用user/showIncludes查看包含树,并确定头文件被拉入的顺序…回滚到原始版本以查看头文件中的依赖项。导致错误的.cpp文件的包含顺序是什么?您还可以使用user/showIncludes查看包含树,并计算出头文件的拉入顺序…回滚到原始版本以查看头文件中的依赖项。我不确定我是否完全理解,您能否详细说明一下?您不理解哪些部分?我不确定我是否完全理解,你能详细说明一下吗?哪些部分你不懂?#pragma在大多数编译器上都很好。它们在VisualStudio、GCC、CLang和我使用的控制台编译器上得到了正确的支持。虽然AndiDog说它们不一定会得到支持是正确的,但实际上,它们在所有流行的现代编译器上都是正确的。它们在VisualStudio、GCC、CLang和我使用的控制台编译器上得到了正确的支持。虽然AndiDog说它们不能保证得到支持是正确的,但实际上它们在所有流行的现代编译器上都得到了支持。
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