乘法定義的函式

單一定義規則最重要的結果是,具有外部連結的非行內函數應該只在程式中定義一次,儘管它們可以多次宣告。因此,不應在標題中定義這樣的函式,因為可以從不同的翻譯單元多次包括標題。

foo.h

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

foo.cpp

#include "foo.h"
void bar() { std:: cout << "bar"; }

main.cpp

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

在這個程式中,函式 foo 在標頭檔案 foo.h 中定義,它包含兩次:一次來自 foo.cpp,一次來自 main.cpp。因此,每個翻譯單元都包含自己對 foo 的定義。請注意,在 foo.h 的包括防護裝置不防止這種情況發生,因為 foo.cppmain.cpp分別包括 foo.h。嘗試構建此程式的最可能結果是連結時錯誤,將 foo 標識為已經多次定義。

為了避免這樣的錯誤,應該在標頭檔案中宣告函式並在相應的 .cpp 檔案中定義它們,但有一些例外(參見其他示例)。