正如您在评论中指出的那样,您包括a.h
在内test.h
,反之亦然。由于循环依赖(也称为交叉包含),这会引入错误,因为函数和类“未定义” 。
在您的情况下,当.cpp
文件包含时test.h
,它首先包含a.h
然后定义函数,这显然不是您想要的,因为在处理时,未定义。anything();
a.h
anything()
在编译包含test.h
(before a.h
) 的单元时,您的代码会扩展为与此类似的内容,该单元本身首先包含a.h
其他任何内容:
/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};
inline void anything() {
....
}
如您所见,使用时没有anything()
定义。但是,如果一个编译单元包含a.h
(before test.h
),而它本身包含test.h
,它会扩展为如下内容:
/* INCLUDED FROM test.h */
inline void anything() {
....
}
class Fooness{
public:
Fooness(){
anything();
};
};
所以顺序是正确的。
为了使其在这两种情况下都能正常工作,您可以在包含之前进行前向声明 :anything()
test.h
a.h
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
(before a.h
) 时,它会扩展为以下内容:
void anything();
/* INCLUDED FROM a.h */
class Fooness{
public:
Fooness(){
anything();
};
};
inline void anything() {
....
}