C++ 为什么要将内联函数def放在其他头文件中,其中包含内联函数声明所在的头文件是链接错误?
我有两个标题C++ 为什么要将内联函数def放在其他头文件中,其中包含内联函数声明所在的头文件是链接错误?,c++,inline,one-definition-rule,C++,Inline,One Definition Rule,我有两个标题 // header1.h class A { public: void f(); }; // header2.h #include "header1.h" inline void A::f() { std::cout << "Yahoo."; } // test1.cpp #include "header1.h" int main() { A a; a.f(); return 0; } // test2.cpp #include "header2.
// header1.h
class A
{
public:
void f();
};
// header2.h
#include "header1.h"
inline void A::f()
{
std::cout << "Yahoo.";
}
// test1.cpp
#include "header1.h"
int main() { A a; a.f(); return 0; }
// test2.cpp
#include "header2.h"
void ff() { /* do nothing */ }
//header1.h
甲级
{
公众:
无效f();
};
//校长2.h
#包括“header1.h”
内联void A::f()
{
std::cout这不是使用内联函数的方式。在test.cpp
文件中,编译器如何知道函数A::f
被标记为inline
如果需要内联成员函数,则必须在同一头文件中定义它,或者在定义它的头文件中包含它
所以解决方案一:#包括“header2.h”
,而不是“header1.h”
解决方案二:在类内内联定义函数:
class A
{
public:
void f() { ... }
};
解决方案三:在类之后但在同一头文件中定义函数:
class A { ... };
inline void A::f() { ... }
内联函数不是这样做的。在test.cpp
文件中,编译器怎么知道函数A::f
被标记为inline
如果需要内联成员函数,则必须在同一头文件中定义它,或者在定义它的头文件中包含它
所以解决方案一:#包括“header2.h”
,而不是“header1.h”
解决方案二:在类内内联定义函数:
class A
{
public:
void f() { ... }
};
解决方案三:在类之后但在同一头文件中定义函数:
class A { ... };
inline void A::f() { ... }
内联函数不是这样做的。在test.cpp
文件中,编译器怎么知道函数A::f
被标记为inline
如果需要内联成员函数,则必须在同一头文件中定义它,或者在定义它的头文件中包含它
所以解决方案一:#包括“header2.h”
,而不是“header1.h”
解决方案二:在类内内联定义函数:
class A
{
public:
void f() { ... }
};
解决方案三:在类之后但在同一头文件中定义函数:
class A { ... };
inline void A::f() { ... }
内联函数不是这样做的。在test.cpp
文件中,编译器怎么知道函数A::f
被标记为inline
如果需要内联成员函数,则必须在同一头文件中定义它,或者在定义它的头文件中包含它
所以解决方案一:#包括“header2.h”
,而不是“header1.h”
解决方案二:在类内内联定义函数:
class A
{
public:
void f() { ... }
};
解决方案三:在类之后但在同一头文件中定义函数:
class A { ... };
inline void A::f() { ... }
您的编译器不知道在哪里可以找到A::f()
,因为您从未告诉过它在哪里可以找到。您需要#在test.cpp中包含“header2.h”
。或者,或者将A::f()的定义移动到header1.h您的编译器不知道在哪里可以找到A::f()
因为你从来没有告诉它去哪里找。你需要在test.cpp中包含“header2.h”
。或者,或者将A::f()的定义移动到header1.h
你的编译器不知道在哪里找到A::f()
,因为你从来没有告诉过它去哪里找。你需要包含“header2.h”
在test.cpp中。要么这样,要么将A::f()的定义移动到header1.h
你的编译器不知道在哪里可以找到A::f()
,因为你从来没有告诉它去哪里找。你需要在test.cpp中包含“header2.h”
。要么这样,要么移动A::f()的定义进入header1.h
规则是“应在odr使用的每个翻译单元中定义内联函数。”A::f()test.cpp
中没有定义
,因为它不包括header2.h
。你怎么期望编译器知道header2.h
?它没有包含在你的代码中,也没有在你的代码中提到。如果成功的话,你可以将你的函数定义放到一个电子邮件并将其发送到桑给巴尔。@AndreyT我添加了一个文件include header2.h,仍然有错误……规则是“在odr使用的每个翻译单元中都应定义一个内联函数。”a::f()test.cpp
中没有定义
,因为它不包括header2.h
。你怎么期望编译器知道header2.h
?它没有包含在你的代码中,也没有在你的代码中提到。如果成功的话,你可以将你的函数定义放到一个电子邮件并将其发送到桑给巴尔。@AndreyT我添加了一个文件include header2.h,仍然有错误……规则是“在odr使用的每个翻译单元中都应定义一个内联函数。”a::f()test.cpp
中没有定义
,因为它不包括header2.h
。你怎么期望编译器知道header2.h
?它没有包含在你的代码中,也没有在你的代码中提到。如果成功的话,你可以将你的函数定义放到一个电子邮件并将其发送到桑给巴尔。@AndreyT我添加了一个文件include header2.h,仍然有错误……规则是“在odr使用的每个翻译单元中都应定义一个内联函数。”a::f()test.cpp
中没有定义
,因为它不包括header2.h
。你怎么期望编译器知道header2.h
?它没有包含在你的代码中,也没有在你的代码中提到。如果成功的话,你可以将你的函数定义放到一个电子邮件并将其发送到桑给巴尔。@AndreyT我添加了一个文件include header2.h,仍然错误…所以编译器认为a::f()未定义?@Huang zh编译器不知道,甚至不关心。链接器需要知道所有符号都已定义,并且因为没有(即源文件)定义<