无尽的包含循环

时间:2011-10-30 18:40:35

标签: c++ include-guards

  

可能重复:
  C header file loops

原始问题:

我总是在理解以下错误原因时遇到问题:

something.h

#ifndef SOMETHING_H
#define SOMETHING_H

#include "somethingelse.h"

#endif

somethingelse.h

#ifndef SOMETHINGELSE_H
#define SOMETHINGELSE_H

#include "something.h"

#endif

为什么会出错?

1)未定义SOMETHING_H

2)SOMETHING_H被定义,有些人被包括在内

3)SOMETHINGELSE_H未定义,定义,并且包含了something.h

4)定义了SOMETHING_H,跳转到#endif,这应该是它的结尾了吗?


编辑:

结果证明它根本没有任何错误。但是以下是:

something.h

#pragma once

#include "somethingelse.h"

class something {
    int y;
    somethingelse b;
};

somethingelse.h

#pragma once

#include "something.h"

class somethingelse {
    something b;
    int x;
};

这是合乎逻辑的,因为当'somethingelse'需要该类的实例时,尚未定义类'某事'。

问题通过前瞻性定义解决:

something.h

#pragma once

class somethingelse;

class something {
    int y;
    somethingelse* pB; //note the pointer. Correct me if I'm wrong but I think it cannot be an object because the class is only declared, not defined.
};

在.cpp中,你可以包含“somethingelse.h”,并创建该类的实例。

2 个答案:

答案 0 :(得分:1)

您的描述完全正确,但完全没有错误。在各个地方添加pragma message("Some text")(假设Visual Studio)以跟踪流程。

正如其他海报已经注意到的那样,您的头文件很可能包含相互需要彼此定义的类,这就是问题的原因。这类问题通常由

解决
  • 尽可能使用前向引用
  • 尽可能将#include移至CPP文件

答案 1 :(得分:0)

这正是发生的事情。

这被称为“包含守卫”,用于避免无限递归包含。