C++ 在声明C+中实现+;

C++ 在声明C+中实现+;,c++,C++,我想在.h文件中包含函数的实现 我知道我宁愿将.h和.c文件的声明和实现分开,这不是我问题的一部分 在类内实现函数时,未收到任何错误: class Foo { public: // Class constructor Foo() { } }; 在类外实现函数时(仍在.h文件中): 我收到以下错误: Foo:Foo()的多个定义 有人能给我解释一下这背后的逻辑吗?谢谢。这是因为在类定义中定义函数时,该方法被视为内联函数。可以包含在多个源文件中,可以编译并链接在一起,并且链接器

我想在.h文件中包含函数的实现

我知道我宁愿将.h和.c文件的声明和实现分开,这不是我问题的一部分

在类内实现函数时,未收到任何错误:

class Foo
{
  public:
    // Class constructor
    Foo() { }
};
在类外实现函数时(仍在.h文件中):

我收到以下错误:
Foo:Foo()的多个定义


有人能给我解释一下这背后的逻辑吗?谢谢。

这是因为在类定义中定义函数时,该方法被视为
内联
函数。可以包含在多个源文件中,可以编译并链接在一起,并且链接器仍然不会抱怨多个定义

但是,当您在类之外定义构造函数时,
#将它包含在多个源文件中,将它们编译在一起,然后链接它们。同一个函数有多个定义

请记住,
#include
将一个文件复制粘贴到包含它的文件中。因此,每次包含该文件时,都会在该源文件中获得函数的定义。然后,当您编译并链接多个这样的源时,您会得到同一个非内联函数的多个定义


有关更多信息,请参阅
inline
,请参阅。“示例”部分提供了大量代码,这些代码应该会有所帮助



您还可以显式地将类外的定义标记为
inline
,就像正确注释一样

标记它
inline

class Foo
{
  public:
    // Class constructor
    inline Foo();
};

inline Foo::Foo()
{
}
与之类似,类内定义是隐式内联的。但是,如果在类之外的头中定义它,则必须显式地添加说明符


在这种情况下,内联说明符对于正确链接非常重要。它允许相同的函数存在于多个翻译单元中,只要它是完全相同的函数体。在头文件中定义的函数经常出现的情况。

<代码>内联 C中的C++有不同的语义,我认为其他问题不相关。链接问题中的代码可能无法用C编译,但正确无误,C++@M.M中的良好实践更新了我的答案!虽然只是出于好奇,语义上有什么区别?看看C++中的内联到底需要什么?包含守卫难道还不够吗?@dhein-包含守卫可以防止你在同一个翻译单元中被双重包含。但标题应自由包含在单独的翻译单元中。当生成的对象文件被链接时,你会得到一个ODR冲突,除非编译器被告知这是一个内联函数。哦,等等。。。我得到了它!既然C++包含在标准中?我记得几年前在一个私人项目中遇到过这样的问题。。。。我的老师告诉我使用原型的功能,使我的项目再次工作。这在一段时间内起到了帮助作用,但后来却让情况变得更糟,我干脆放弃了这个项目。我想再挖一次,看看这在当时是否能解决它。@dhein-从C++98开始。最初也是“对编译器的提示”,即整个函数体都应该内联,但现在已经不推荐了。然而,联系的影响仍然存在,并且非常重要。
class Foo
{
  public:
    // Class constructor
    inline Foo();
};

inline Foo::Foo()
{
}