内联函数

声明 inline 的函数可以在多个转换单元中定义,前提是所有定义都相同。它也必须在使用它的每个翻译单元中定义。因此,在头文件中定义内联函数,并且不需要在实现文件中提及它们。

该程序的行为就好像只有一个函数定义。

foo.h

#ifndef FOO_H
#define FOO_H
#include <iostream>
inline void foo() { std::cout << "foo"; }
void bar();
#endif

foo.cpp

#include "foo.h"
void bar() {
    // more complicated definition
}

main.cpp

#include "foo.h"
int main() {
    foo();
    bar();
}

在这个例子中,更简单的函数 foo 在头文件中内联定义,而更复杂的函数 bar 不是内联的并且在实现文件中定义。foo.cppmain.cpp 翻译单元都包含 foo 的定义,但由于 foo 是内联的,因此该程序格式正确。

在类定义(可以是成员函数或朋友函数)中定义的函数是隐式内联的。因此,如果在头中定义了类,则可以在类定义中定义类的成员函数,即使这些定义可能包含在多个转换单元中:

// in foo.h
class Foo {
    void bar() { std::cout << "bar"; }
    void baz();
};

// in foo.cpp
void Foo::baz() {
   // definition
}

Foo::baz 函数是在线外定义的,因此它不是内联函数,不能在标题中定义。