Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要将内联函数def放在其他头文件中,其中包含内联函数声明所在的头文件是链接错误?_C++_Inline_One Definition Rule - Fatal编程技术网

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编译器不知道,甚至不关心。链接器需要知道所有符号都已定义,并且因为没有(即源文件)定义<