为什么我会收到“太多包含文件:深度= 1024”?

时间:2010-03-13 12:08:58

标签: c++ include

我正在使用Visual Studio 2008 Express版,并且不断收到以下错误:

"Cascadedisplay.h(4) : fatal error C1014: too many include files : depth = 1024

显然我对包含文件做了一些非常错误的事情,但我看不出是什么。

基本上,我有一个接口类StackDisplay,我希望从另一个文件中导出CascadeDisplay

#if !defined __BASE_STACK_DISPLAY_H__
#define __BASE_STACK_DISPAY_H__

#include <boost\shared_ptr.hpp>
#include "CascadeDisplay.h"

namespace Sol
{
    class StackDisplay
    {
        public:
            virtual ~StackDisplay();
            static boost::shared_ptr<StackDisplay>
            make_cascade_display(boost::shared_ptr<int> csptr)
            {
                return boost::shared_ptr<StackDisplay>(new CascadeDisplay(csptr));
            }
    };
}
#endif

然后在CascadeDisplay.h中:

#if !defined __CASCADE_DISPLAY_H__
#define __CASCADE_DISPAY_H__

#include "StackDisplay.h"
#include <boost\shared_ptr.hpp>

namespace Sol
{
    class CascadeDisplay: public StackDisplay
    {
        public:
            CascadeDisplay(boost::shared_ptr<int> csptr){};
    };
}

#endif

那是怎么回事?

3 个答案:

答案 0 :(得分:9)

#if !defined __CASCADE_DISPLAY_H__
#define __CASCADE_DISPAY_H__

第二行应该是:

#define __CASCADE_DISPLAY_H__

同样:

#if !defined __BASE_STACK_DISPLAY_H__
#define __BASE_STACK_DISPAY_H__

此外,包含双下划线的名称是为实现保留的,不允许在自己的代码中创建此类名称。对于以单个下划线和大写字母开头的名称也是如此。

答案 1 :(得分:4)

你的警卫中有一个拼写错误

#if !defined __CASCADE_DISPLAY_H__     <--- here you have DISPLAY
#define __CASCADE_DISPAY_H__           <--- here you have DISPAY (no L!)

是的,避免使用此类名称的双下划线

答案 2 :(得分:3)

#if !defined...合法吗?我总是使用#ifndef

无论哪种方式,为什么您的“基础”类需要引用CascadeDisplay?这似乎不对。考虑替换您的调用以创建一个新的CascadeDisplay,调用StackDisplay中的纯虚函数,您的子类必须正确实现。

IE,类似的东西(原谅,我没有方便的c ++编译器来检查这个):

namespace Sol
{
    class StackDisplay
    {
        public:
            virtual ~StackDisplay();
            boost::shared_ptr<StackDisplay>
            make_cascade_display(boost::shared_ptr<int> csptr)
            {
                return make_display(csptr);
            }

        protected:
            virtual boost::shared_ptr<StackDisplay> make_display(boost::shared_ptr<int> csptr) = 0;
    };

    class CascadeDisplay: public StackDisplay
    {
        public:
            CascadeDisplay(boost::shared_ptr<int> csptr){};

        protected:
            virtual boost::shared_ptr<StackDisplay> make_display(boost::shared_ptr<int> csptr)
            {
                return new CascadeDisplay(csptr);
            }
    };
}

我相信这个解决方案通常优于前向声明,因为你消除了超类和子类之间的一些紧密耦合,并且除此之外还创建了一个更通用的接口。这使您可以在StackDisplay.h中消除CascadeDisplay.h的#include