函式放在標頭檔案中被多次包含的重定義問題
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源
例如一個頭檔案headfile.h這樣寫
#pragma once
bool Func (){return true;}
在這個標頭檔案被多個地方包含的時候就會出問題,連結時報錯: (FuncB報重定義)
“fatal error LNK1169: 找到一個或多個多重定義的符號”
原因是,在headfile.h中定義了函式及其實現,如果被包含時,則會把函式實現放入包含的位置,被包含多次時,則會被放入多次,從而導致Func重定義。
那怕是在標頭檔案中使用了#pragma once或是#ifdef __xxx /#define __xxx/#endif也不能解決這種問題。原因是每個.cpp的編譯都是多獨立的,對於每個cpp來說,都是包含了Func的宣告和實現,所以在連結時就不清楚到底是連結哪一個同名函數了。
解決方法也很簡單:
方法一: 新增inline標識,新增完inline標識後,函式的內容程式碼被直接解釋到呼叫處了,連結時相當於不存在這個函式,也就不存函式重定義的情況。
Inline bool Func () {return true;}
方法二: 新增static標識
static bool Func () {return true;}
方法三: 放入到類中
class ClassA
{
public:
bool Func () {return true;}
}
對於方法二與方法三,我個人猜測,對於靜態函式和類,無論有多少檔案包含它,也只會維護一份,連結時也就只能找到這一份,所以也是沒有問題。
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源