为什么在成员函数的定义中应该使用inline关键字。而不是声明?
答案 0 :(得分:10)
inline
有一些史前用途,但现在最好记住它说:“这个定义将被定义多次,这没关系。”
也就是说,通常单定义规则禁止函数的多个定义。这样:
// foo.hpp
void foo() { /* body */ }
// a.cpp
#include "foo.hpp"
// b.cpp
#include "foo.hpp"
导致错误,因为foo
在两个翻译单元中定义。您可以根据需要随时声明事物。这样:
// foo.hpp
void foo();
// foo.cpp
void foo()
{
/* body */
}
// a.cpp
#include "foo.hpp"
// b.cpp
#include "foo.hpp"
很好,因为foo
定义一次,并且多次声明。 inline
做的是允许这样做:
// foo.hpp
inline void foo() { /* body */ }
// a.cpp
#include "foo.hpp"
// b.cpp
#include "foo.hpp"
上班。它说“如果你不止一次看到foo
,那就假设它们是相同的并且可以使用它”。
答案 1 :(得分:3)
不,它也可以在成员函数声明中使用。虽然msdn文档不是标准的,但它被提及MSDN inline。请参阅其中的注释部分。
但是,我了解到,尽管明确提到了内联,但现代编译器还是要内联函数。
class foo
{
inline void methodOne();
};
void foo::methodOne()
{
}
此外,可以将声明和定义指定为具有相同的效果。
class foo
{
inline void methodOne();
};
inline void foo::methodOne() // Here keyword inline is optional. Needs to be mentioned if method declaration isn't declared inline.
{
}
以上两者都会产生同样的效果。
答案 2 :(得分:1)
这是因为它只是编译器将函数体直接放在调用它的位置的线索。因此,编译器查看定义函数的位置是有意义的。因此,如果您在内联函数,则应将实际的函数代码放在类头文件中,如果不这样做,则可能会出现链接器错误。
如果您想了解更多有关内联的信息,请查看:http://www.parashift.com/c++-faq-lite/inline-functions.html