首页 >后端开发 >C++ >在 C 中如何避免循环头包含?

在 C 中如何避免循环头包含?

Barbara Streisand
Barbara Streisand原创
2024-10-26 15:26:021044浏览

How Can Circular Header Inclusion Be Avoided in C  ?

C 中相互包含的头文件

C 头文件可以相互包含,但必须遵循某些准则以避免编译错误。

包含语句放置

包含语句应放置在内部预处理器宏,称为包含防护,以防止多次包含。当标头相互包含时,这一点尤其重要。

转发声明

考虑以下代码,其中两个类 A 和 B 相互包含:

<code class="cpp">// A.h

#ifndef A_H_
#define A_H_

#include "B.h"

class A
{
public:
    A() : b(*this) {}

private:
    B b;
};

#endif</code>
<code class="cpp">// B.h

#ifndef B_H_
#define B_H_

#include "A.h"

class B
{
public:
    B(A& a) : a(a) {}

private:
    A& a;
};

#endif</code>

在这种情况下,编译器首先遇到类 B,但 A 尚未声明。要解决此问题,应在 B 的定义之前包含 A 的前向声明

<code class="cpp">// B.h

#ifndef B_H_
#define B_H_

class A;  // Forward declaration of class A

#include "A.h"

class B
{
public:
    B(A& a) : a(a) {}

private:
    A& a;
};

#endif</code>

此前向声明通知编译器 A 是一个类,即使其完整定义尚不可用。

实践中

一般来说,#include 语句应该放在 include 守卫内,当 header 需要引用时应该使用前向声明到稍后包含的标头中定义的类。通过遵循这些准则,您可以避免由循环包含引起的编译错误。

以上是在 C 中如何避免循环头包含?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn