首页 > 后端开发 > C++ > 正文

如何处理 C 中标头之间的循环依赖关系?

Linda Hamilton
发布: 2024-10-26 12:11:29
原创
401 人浏览过

 How to Handle Circular Dependencies Between Headers in C  ?

C 中的标头相互包含

在 C 中,标头有时需要相互包含。但是,这可能会导致问题,尤其是在放置 #include 语句的位置时。

内部或外部宏

一般来说,#include 语句应该放置在宏内部,例如#ifndef include Guards。这可以防止编译过程中的无限递归,如下例所示:

<code class="cpp">// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_</code>
登录后复制
<code class="cpp">// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

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

#endif // B_H_</code>
登录后复制

将 #include 语句放在宏之外会导致编译器由于 A.h 和 B.h 之间的相互包含而无限递归

未声明的类型

但是,将 #include 语句放在宏内可能会导致未声明类型的问题。例如,考虑以下代码:

<code class="cpp">// A.h
#ifndef A_H_
#define A_H_

class A;  // Forward declaration

#include "B.h"

class A {
    private:
        B b;
    public:
        A() : b(*this) {}
};

#endif // A_H_</code>
登录后复制
<code class="cpp">// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_</code>
登录后复制

在这种情况下,编译器会抱怨 A 是 B.h 中未声明的类型。这是因为当包含 B.h 时,A.h 中的前向声明是不可见的。

解决方案:前向声明

要解决这些问题,最好使用前向声明并在必要时包含包含完整定义的标题。在此示例中,应将 A 的前向声明添加到 B.h 的 B 定义之前:

<code class="cpp">// B.h
#ifndef B_H_
#define B_H_

class A;  // Forward declaration

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_</code>
登录后复制

以上是如何处理 C 中标头之间的循环依赖关系?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!