内联函数和非内联函数在语言上的主要区别在于,内联函数不受单一定义规则的约束,前提是所有定义都相同。
这是 C++ 的一个关键特性,因为它允许您在类定义中编写成员函数定义,并且仍然能够将类定义包含在头文件中。
考虑这个标题:
// stupid.h
#ifndef H_STUPID
#define H_STUPID
int foo() { return 8; }
#endif
stupid.h 如果您必须多次包含它,则无法使用它,因为您最终会得到foo 的多个定义。声明inline 可以让你绕过这个问题。将相同的逻辑应用于类定义(请记住,所有内联定义的成员函数都隐式声明为inline),这样我们就可以这样写:
// works.h
#ifndef H_WORKS
#define H_WORKS
class Foo
{
int n;
public:
void f() { n *= 2; } // implicitly inline!
int g() const { return n; } // ditto
};
#endif
我们可以在任意数量的翻译单元中包含works.h,Foo::f 和Foo::g 没有“多重定义”错误,因为它们是(隐式)内联声明的。
当然inline 也可以作为提示编译器用函数体的副本替换函数调用,但是编译器可以选择这样做或不这样做,这与你是否声明函数 @ 无关987654329@.