看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《singlovesong (~"~)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : linux g++ : 大家好 : 我在程式中寫了一個 util.h : 然後我寫了一個 A.h 跟B.h : A.h 裡面我 include 了 util.h : B.h 裡面我 include 了 A.h 跟 util.h : 請問這樣會有多重定義的問題嗎? : 我以為應該會有 結果竟然可以成功compile 跟 link : 想多了解一下甚麼情況下才會有這個問題 又為什麼我這樣寫沒這個問題呢? : 是因為較新的compiler 幫我處理掉了嗎? : 謝謝! 看名字就知道, 多重定義是要在有「定義」出現的時候才會發生 如果你的 util.h 長得像這樣: class Foo; void somFunction(); int calculateSomethingFromObject(Foo *foo); 然後你把實作放在 util.cpp, 並編譯 util.cpp A.cpp B.cpp 後連結 因為函數本來就只有一份, 而 forward declaration 只是宣告而已沒有重複問題 所以當然不會有問題 可是如果你的 util.h 包含這種東西: struct UtilSetting { int bar; bool baz; }; 那就會有重複宣告的問題 因為在編譯時編譯器會發現你的 B.h 裡有兩個重複的 UtilSetting 宣告 C/C++ 編譯器絕對不會幫你解決這個問題, 你要自己寫 include guards 至於為什麼它們不幫你解決, 這就是一個很好的問題, 我也想知道... 然後不論如何, 寫 header 的時候順手加上 include guards 是好習慣 即使不必要先加再說, 不會出事的 -- 「我最想要的同伴嘛,首先是要笑口常開,其次是我們能永遠不會發生誤會。 如果這些都能辦到的話,嗯,如果他是世界上第一流的橋手,也還不錯。」 -- 班尼多‧加羅素,前義大利藍隊成員 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.81.146
xvid:宣告可以重複喔 不能重複的是定義 12/05 00:58
james732:宣告可以重複? 12/05 01:03
legendmtg:宣告可以重複沒錯啊 12/05 01:47
james732:http://ideone.com/PAWKqn 這UtilSetting是宣告還是定義? 12/05 01:50
james732:(突然覺得有點混淆了...) 12/05 01:51
uranusjr:呃, 應該是定義, 我用語有誤...不知不覺就跟著原文的用詞 12/05 01:53
james732:咦,所以 struct UtilSetting; 這樣是才是宣告 12/05 01:55
james732:struct UtilSetting { xx xx; }; 這樣是定義吧? 12/05 01:55
linotwo:定義 = define 宣告 = declare 12/05 02:50
linotwo:例如 int i, j; 宣告 i, j 為整數變數 12/05 02:51
linotwo:但是 int i, i; 會錯,因為重複宣告 i 12/05 02:51
linotwo:宣告不應該重複,以避免同一個 symbol 有不同解釋。 12/05 02:54
linotwo:光是只有 struct UtilSetting; 不能算完整的宣告 12/05 02:55
legendmtg:int i, j;是定義 extern int i, j;才是宣告 12/05 07:13
legendmtg:對struct和class如james732所講 12/05 07:13
linotwo:int i; 是將 identifier i 與整數變數的實體做連結 12/05 08:18
linotwo:struct UtilSetting {...}; 則是將 UtilSetting 與其後的 12/05 08:19
linotwo:struct 的定義做連結 12/05 08:19
linotwo:我認為這兩者都算是宣告 12/05 08:20
linotwo:如果只有 struct UtilSetting; 是 forward declaration 12/05 08:21
linotwo:表示完整的定義在別的地方 12/05 08:22
linotwo:C++ Declarations and Definitions http://ppt.cc/TSGT 12/05 09:32
legendmtg:你的link上面明明就寫了 12/05 12:55
legendmtg:// Declare and define int variables i and j. 12/05 12:55
legendmtg:int i; 12/05 12:55
legendmtg:int j = 10; 12/05 12:55
legendmtg:Some declarations that are not definitions are: 12/05 12:55
legendmtg:extern int i; 12/05 12:56
POSIX:宣告可重複無誤!分檔配著寫makefile 可以體會良多 T_T 12/05 15:22
linotwo:不包含定義的宣告可以重複,前提是宣告的內容一致。 12/05 18:05
linotwo:如果是包含了定義的宣告就不能重複。 12/05 18:06
amozartea:用#pragma once? 12/14 02:10
amozartea:可以用記憶體去想嗎 有配記憶體的就是定義? 12/14 02:13