乘法定義的函式
單一定義規則最重要的結果是,具有外部連結的非行內函數應該只在程式中定義一次,儘管它們可以多次宣告。因此,不應在標題中定義這樣的函式,因為可以從不同的翻譯單元多次包括標題。
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
檔案中定義它們,但有一些例外(參見其他示例)。