行內函數
宣告 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.cpp
和 main.cpp
翻譯單元都包含 foo
的定義,但由於 foo
是內聯的,因此該程式格式正確。
在類定義(可以是成員函式或朋友函式)中定義的函式是隱式內聯的。因此,如果在頭中定義了類,則可以在類定義中定義類的成員函式,即使這些定義可能包含在多個轉換單元中:
// in foo.h
class Foo {
void bar() { std::cout << "bar"; }
void baz();
};
// in foo.cpp
void Foo::baz() {
// definition
}
Foo::baz
函式是線上外定義的,因此它不是行內函數,不能在標題中定義。