友元函數重定義 / multiple definition

  在頭文件的一個類中聲明瞭友元函數,在頭文件的類外實現了這個函數,連接的時候出現了multiple definitionhtml

  解決方法:將友元函數的實現聲明爲inline    或者   將友元函數的實現放在cpp裏函數

 

轉自:http://www.javashuo.com/article/p-plnxqmvd-dg.html htm

在最近的項目裏,因爲我想重載結構體的==操做符,然而大意的我把重載的過程寫在了頭文件裏,因此致使了multiple definition of的錯誤。如今總結下解決方法:blog

首先,最關鍵的,不要把全局變量以及全局方法的定義放在頭文件裏!!!!ip

1.給每個頭文件加上條件編譯:
注:此方法不是解決上述問題的方法,只是解決multiple definition of的一個方法。
當多個文件包含同一個頭文件時,而頭文件中沒有加上條件編譯,就會獨立的解釋,而後生成每一個文件生成獨立的標示符。在編譯器鏈接時,就會將工程中全部的符號整合在一塊兒,因爲,文件中有重名變量,因而就出現了重複定義的錯誤。 
給每個頭文件加上條件編譯,避免該文件被屢次引用時被屢次解釋,這是個應該是習慣。這個方法會解決大部分低級問題。
條件編譯示例
#ifndef TEST_H
#define TEST_H
……
#endifget

2.使用extern定義全局變量:
能夠把全部的全局變量放入一個頭文件 global.h (名字隨意起,但要加條件編譯)中,每個變量前面加extern,聲明一下這些變量將在其它文件中定義。 而後創建一個和頭文件名字對應的.c or .cpp文件 如global.c。在裏面聲明全部的全局變量。例如:void(*Handl_Display)();
而後,讓涉及到全局變量的文件include 」global.h「。這樣編譯時,會先對global.c編譯生成一個global.o ,而後再和其它文件的.o連接生成可執行文件。
簡單一點說,就是在變量前加extern,以後變量的聲明放在.c中。編譯器

 

3.使用Static修飾:
在變量前加static,聲明成靜止變量。
這個方法雖然能夠解決multiple definition的問題,可是卻會引起其餘問題。
問題以下:
三個文件,a.h,a.c,b.c;
在a.c和b.c 都include了a.h。
在b.c中調用a.c中的函數對a.h中的變量進行賦值,但事實上b.c中的變量仍沒被賦值。
問題分析:
static的含義是迫使那個變量只在某個文件可見。 
假定你在頭文件定義static x; 
且這個頭文件分別被a.c和b.c包含;
實質是在a.c和b.c裏會分別定義一個名字叫x的變量,兩個x毫無關係。
在a.c裏修改x,他不會致使b.c裏的x變化.it

相關文章
相關標籤/搜索