gpt4 book ai didi

c++ - 为什么这个 cpp 看到一个函数,而它相应的头文件却没有?

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

这个让我挠头太久了。

我在标题 test.h 中有以下内容:

inline void anything(){
std::cout<<" anything "<<ii;
}

然后我有 a.h,其中包括 test.h:

class Fooness{
public:
Fooness(){
anything(); //compiler reports "use of undeclared identifier"
};
};

但是,如果我只是将函数定义移动到 a.cpp 中:

Fooness::Fooness(){
anything();
}

它有效。 a.cpp 包含 test.h,其中包含 a.h。为什么 anything() 只在 a.cpp 而不是 a.h 中可见?

最佳答案

正如您在评论中指出的,您在 test.h 中包含了 a.h反之亦然。由于循环依赖(也称为交叉包含),这引入了函数和类“未定义”的错误。

在您的情况下,当 .cpp 文件包含 test.h 时,它首先包含 a.hthen定义了函数anything();,这显然不是你想要的,因为在处理a.h时,anything() 未定义。

当编译包含 test.h(在 a.h 之前)的单元时,您的代码扩展为与此类似的内容,该单元本身包含 a.h 在其他任何事情之前:

/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};

inline void anything() {
....
}

如您所见,在您使用它时没有定义anything()。但是,如果编译单元包含 a.h(在 test.h 之前),它本身包含 test.h,它会扩展为如下所示:

/* INCLUDED FROM test.h */
inline void anything() {
....
}

class Fooness{
public:
Fooness(){
anything();
};
};

所以顺序是正确的。

为了使它在这两种情况下都能工作,您可以在包含 之前在 test.hforward-declare anything():

test.h 的更正版本:

#ifndef TEST_H
#define TEST_H

void anything(); // forward-declaration

#include "a.h" // <-- this is important to be *below* the forward-declaration

inline void anything() {
....
}

// more stuff

#endif

然后,当包含 test.h(在 a.h 之前)时,它会扩展为以下内容:

void anything();

/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};

inline void anything() {
....
}

关于c++ - 为什么这个 cpp 看到一个函数,而它相应的头文件却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14432092/

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