Re: [問題] multiple include

看板C_and_CPP (C/C++)作者 (←這人是超級笨蛋)時間13年前 (2012/12/05 00:06), 編輯推噓7(7026)
留言33則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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

12/05 00:58, , 1F
宣告可以重複喔 不能重複的是定義
12/05 00:58, 1F

12/05 01:03, , 2F
宣告可以重複?
12/05 01:03, 2F

12/05 01:47, , 3F
宣告可以重複沒錯啊
12/05 01:47, 3F

12/05 01:50, , 4F
http://ideone.com/PAWKqn 這UtilSetting是宣告還是定義?
12/05 01:50, 4F

12/05 01:51, , 5F
(突然覺得有點混淆了...)
12/05 01:51, 5F

12/05 01:53, , 6F
呃, 應該是定義, 我用語有誤...不知不覺就跟著原文的用詞
12/05 01:53, 6F

12/05 01:55, , 7F
咦,所以 struct UtilSetting; 這樣是才是宣告
12/05 01:55, 7F

12/05 01:55, , 8F
struct UtilSetting { xx xx; }; 這樣是定義吧?
12/05 01:55, 8F

12/05 02:50, , 9F
定義 = define 宣告 = declare
12/05 02:50, 9F

12/05 02:51, , 10F
例如 int i, j; 宣告 i, j 為整數變數
12/05 02:51, 10F

12/05 02:51, , 11F
但是 int i, i; 會錯,因為重複宣告 i
12/05 02:51, 11F

12/05 02:54, , 12F
宣告不應該重複,以避免同一個 symbol 有不同解釋。
12/05 02:54, 12F

12/05 02:55, , 13F
光是只有 struct UtilSetting; 不能算完整的宣告
12/05 02:55, 13F

12/05 07:13, , 14F
int i, j;是定義 extern int i, j;才是宣告
12/05 07:13, 14F

12/05 07:13, , 15F
對struct和class如james732所講
12/05 07:13, 15F

12/05 08:18, , 16F
int i; 是將 identifier i 與整數變數的實體做連結
12/05 08:18, 16F

12/05 08:19, , 17F
struct UtilSetting {...}; 則是將 UtilSetting 與其後的
12/05 08:19, 17F

12/05 08:19, , 18F
struct 的定義做連結
12/05 08:19, 18F

12/05 08:20, , 19F
我認為這兩者都算是宣告
12/05 08:20, 19F

12/05 08:21, , 20F
如果只有 struct UtilSetting; 是 forward declaration
12/05 08:21, 20F

12/05 08:22, , 21F
表示完整的定義在別的地方
12/05 08:22, 21F

12/05 09:32, , 22F
C++ Declarations and Definitions http://ppt.cc/TSGT
12/05 09:32, 22F

12/05 12:55, , 23F
你的link上面明明就寫了
12/05 12:55, 23F

12/05 12:55, , 24F
// Declare and define int variables i and j.
12/05 12:55, 24F

12/05 12:55, , 25F
int i;
12/05 12:55, 25F

12/05 12:55, , 26F
int j = 10;
12/05 12:55, 26F

12/05 12:55, , 27F
Some declarations that are not definitions are:
12/05 12:55, 27F

12/05 12:56, , 28F
extern int i;
12/05 12:56, 28F

12/05 15:22, , 29F
宣告可重複無誤!分檔配著寫makefile 可以體會良多 T_T
12/05 15:22, 29F

12/05 18:05, , 30F
不包含定義的宣告可以重複,前提是宣告的內容一致。
12/05 18:05, 30F

12/05 18:06, , 31F
如果是包含了定義的宣告就不能重複。
12/05 18:06, 31F

12/14 02:10, , 32F
用#pragma once?
12/14 02:10, 32F

12/14 02:13, , 33F
可以用記憶體去想嗎 有配記憶體的就是定義?
12/14 02:13, 33F
文章代碼(AID): #1GlXzqkz (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1GlXzqkz (C_and_CPP)