1. 程式人生 > >函式放在標頭檔案中被多次包含的重定義問題

函式放在標頭檔案中被多次包含的重定義問題

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 轉載請標明來源