乘法定義的函式
單一定義規則最重要的結果是,具有外部連結的非行內函數應該只在程式中定義一次,儘管它們可以多次宣告。因此,不應在標題中定義這樣的函式,因為可以從不同的翻譯單元多次包括標題。
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.cpp 和 main.cpp 都分別包括 foo.h。嘗試構建此程式的最可能結果是連結時錯誤,將 foo 標識為已經多次定義。
為了避免這樣的錯誤,應該在標頭檔案中宣告函式並在相應的 .cpp 檔案中定義它們,但有一些例外(參見其他示例)。