gpt4 book ai didi

c++ - #ifndef 是否可以防止循环引用编译器错误?

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:14 26 4
gpt4 key购买 nike

如果每个 header 都使用 #ifndef,这是否意味着关于循环依赖的编译器错误不会发生?

最佳答案

不,它没有。

这意味着编译器不会尝试包含无穷大的 header ,但是循环依赖仍然会带来逻辑问题,因为编译是从上到下执行的。让我们来看看原因:


源代码

啊.h

#ifndef A_H
#define A_H

#include "b.h"

struct A
{
B* ptr;
};

#endif

b.h

#ifndef B_H
#define B_H

#include "a.h"

struct B
{
A* ptr;
};

#endif

main.cpp

#include "a.h"

int main()
{
A a;
}

预处理器运行后

include guards 使我们能够实际运行预处理器并让它在小于无穷大的时间内完成工作;如此之快,实际上,我已经在下面手工完成了。结果是:

struct B
{
A* ptr;
};

struct A
{
B* ptr;
};

int main()
{
A a;
}

B的定义在A的定义之前,所以A* ptr;无法理解。当然,你可以解决这个问题,但只能通过颠倒包含的顺序,然后你就会遇到相反的问题。前向声明和/或重新架构是解决它的唯一方法。

header guards 解决了一个不同的问题。它们不允许你随心所欲。

关于c++ - #ifndef 是否可以防止循环引用编译器错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21167858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com