行內函數

宣告 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 函式是線上外定義的,因此它不是行內函數,不能在標題中定義。