我想在.h文件中包含函数的实现。
我知道我宁愿将声明和实现分别与.h和.c文件分开,这不是我的问题的一部分。
当我在类中实现该函数时,我没有收到任何错误:
class Foo
{
public:
// Class constructor
Foo() { }
};
当我在类外部实现该函数时(仍然在.h文件中):
class Foo
{
public:
// Class constructor
Foo();
};
Foo::Foo()
{
}
我收到以下错误:
Foo:Foo()
有人可以解释一下这背后的逻辑吗?感谢。
答案 0 :(得分:25)
这是因为在类定义中定义函数时,该方法被视为inline
函数。哪些可以包含在多个源文件中,可以编译和链接在一起,并且链接器仍然不会抱怨多个定义。
但是当您在类外定义构造函数时,#include
在多个源文件中,将它们一起编译然后链接它们。您可以获得同一功能的多个定义。
请记住,#include
文件本质上是该文件的复制粘贴到#include
的文件中。因此,每次包含该文件时,您都会获得该源文件中函数的定义。然后,当您编译并链接多个此类源时,您将获得相同非内联函数的多个定义。
有关inline
的更多信息,请参阅http://en.cppreference.com/w/cpp/language/inline。示例部分有很多应该有用的代码。
您还可以明确地将类外的定义标记为inline
,如@StoryTeller正确指出的那样。
答案 1 :(得分:15)
标记inline
class Foo
{
public:
// Class constructor
inline Foo();
};
inline Foo::Foo()
{
}
与Curious said类似,类内定义是隐式内联的。但是如果你在类之外定义它,在标题中,你必须明确地添加说明符。
在这种情况下,内联说明符对于正确链接非常重要。它允许在多个翻译单元中存在相同的功能,只要它是完全相同的功能体。在头文件中定义的函数经常出现的情况。