Re: [問題] 請問C介面跟實作分開的作法

看板C_and_CPP作者 (God of Computer Science)時間6年前 (2018/04/28 11:58), 編輯推噓21(24356)
留言83則, 17人參與, 6年前最新討論串2/3 (看更多)
想問問如果只寫了一堆c檔,然後其他c檔就只 include 我這個C檔, 加上ifdef這種防止雙重宣告的prototype,不就也可以很順利的編譯程式了嗎? 那這樣根本就不需要header file阿,為什麼還是需要哩?有解否? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.76.244.229 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1524887914.A.242.html

04/28 12:08, 6年前 , 1F
ifdef分別在兩個檔案通過編譯->得到兩份實體->link爆炸
04/28 12:08, 1F

04/28 12:27, 6年前 , 2F
compile time也有差
04/28 12:27, 2F

04/28 12:49, 6年前 , 3F
圖靈打球 你當球
04/28 12:49, 3F

04/28 12:49, 6年前 , 4F
你要這樣玩乾脆就不要 ifdef,全部 static 當 inline
04/28 12:49, 4F

04/28 13:44, 6年前 , 5F
寫錯,是ifndef,這樣應該還是只有一份實作吧
04/28 13:44, 5F

04/28 14:04, 6年前 , 6F
大家都知道你的 ifdef 是指 include guard ...
04/28 14:04, 6F

04/28 14:28, 6年前 , 7F
所以一樓大大應該就講錯了?重點是我曾經用這種方式
04/28 14:28, 7F

04/28 14:28, 6年前 , 8F
成功過才發問的喔
04/28 14:28, 8F

04/28 14:57, 6年前 , 9F
我覺得差異在include c等於是把一堆實作濃縮在一個tran
04/28 14:57, 9F

04/28 14:57, 6年前 , 10F
slation unit include h就是透過linker連結其他的tran
04/28 14:57, 10F

04/28 14:57, 6年前 , 11F
slation unit windows ide會處理比較感覺不出來 linux
04/28 14:57, 11F

04/28 14:57, 6年前 , 12F
make file寫法應該會有差 另外有header對可讀跟維護
04/28 14:57, 12F

04/28 14:57, 6年前 , 13F
性會比較好
04/28 14:57, 13F

04/28 15:01, 6年前 , 14F
其實原文發問是想了解c語言是有什麼特別技巧一定要寫
04/28 15:01, 14F

04/28 15:01, 6年前 , 15F
成文內提的情況 怕沒想好就誤會別人
04/28 15:01, 15F

04/28 16:47, 6年前 , 16F
一樓沒講錯
04/28 16:47, 16F

04/28 16:49, 6年前 , 17F
另外同樣的 prototype 宣告兩次是 ok 的
04/28 16:49, 17F

04/28 16:58, 6年前 , 18F
你會 build 成功是因為你實際上只編譯一個檔案吧
04/28 16:58, 18F

04/28 21:37, 6年前 , 19F
一樓沒講錯。光是compile過跑一兩次沒問題不代表這種做
04/28 21:37, 19F

04/28 21:37, 6年前 , 20F
法就永遠是對的。你這自信到底是哪來的
04/28 21:37, 20F

04/29 00:28, 6年前 , 21F
因為你改了任一檔案 就要全部重新編譯
04/29 00:28, 21F

04/29 00:31, 6年前 , 22F
其他不說 光是重編stdlib就要很久了
04/29 00:31, 22F

04/29 00:38, 6年前 , 23F
因為很多時候對實作不感興趣 與其放很多程式碼 不如
04/29 00:38, 23F

04/29 00:39, 6年前 , 24F
給我一個簡單的介面讓我知道怎麼使用就好
04/29 00:39, 24F

04/29 00:41, 6年前 , 25F
因此 介面與實作分開減少使用者上手的時間 也增加設計
04/29 00:41, 25F

04/29 00:42, 6年前 , 26F
師維護的容易度 這個你寫大一點的C程式才有感覺
04/29 00:42, 26F

04/29 00:43, 6年前 , 27F
一些OOP可以這樣搞是因為他有其他方法去包裝
04/29 00:43, 27F

04/29 00:46, 6年前 , 28F
可以去聽一下jserv大的講座C的物件導向
04/29 00:46, 28F

04/29 12:09, 6年前 , 29F
沒幾個檔的project這樣沒差,如果是幾萬隻檔這樣搞光
04/29 12:09, 29F

04/29 12:09, 6年前 , 30F
compile time你就會瘋掉
04/29 12:09, 30F

04/29 19:43, 6年前 , 31F
一樓才是正確的 我前一篇已經說了
04/29 19:43, 31F

04/29 19:44, 6年前 , 32F
靜態連結在編譯時期發現重複定義而無法編過
04/29 19:44, 32F

04/29 19:44, 6年前 , 33F
動態連結是執行時載入連結時炸掉
04/29 19:44, 33F

04/29 19:49, 6年前 , 34F
你根本就沒有做連結的行為當然不會掛
04/29 19:49, 34F

04/29 20:13, 6年前 , 35F
如果每個 translation unit 都 include .c 就會造成 obj
04/29 20:13, 35F

04/29 20:14, 6年前 , 36F
有重複的內容,整個浪費磁碟空間,至於連結會怎樣要測試
04/29 20:14, 36F

04/29 20:15, 6年前 , 37F
但很明顯的如果某個模組用到某個符號卻沒 include .c
04/29 20:15, 37F

04/29 20:15, 6年前 , 38F
那它就會產生無法決定要用哪個 obj 中的那份定義的問題
04/29 20:15, 38F

04/29 20:17, 6年前 , 39F
反正最好的方式當然是一份 .c 轉 .obj 別人用 .h 引用它
04/29 20:17, 39F

04/30 14:48, 6年前 , 40F
眾人不要誤導 跟compile time一點關係都沒有
04/30 14:48, 40F

04/30 14:48, 6年前 , 41F
就是最基本的語法錯誤 連結時會重複定義
04/30 14:48, 41F

04/30 15:10, 6年前 , 42F
連結時期會有語法錯誤????
04/30 15:10, 42F

04/30 19:50, 6年前 , 43F
linking才出錯就不叫語法錯誤了吧...
04/30 19:50, 43F

04/30 20:59, 6年前 , 44F
undefined reference to某某某class或function算不
04/30 20:59, 44F

04/30 20:59, 6年前 , 45F
算語法錯誤? 如果不算 那我承認不算語法錯誤
04/30 20:59, 45F

04/30 21:32, 6年前 , 46F
不算 (完
04/30 21:32, 46F

05/01 02:04, 6年前 , 47F
你下 gcc -c 看會不會噴 undefined reference
05/01 02:04, 47F

05/01 11:32, 6年前 , 48F
不是叫鏈結錯誤嗎
05/01 11:32, 48F

05/01 20:24, 6年前 , 49F
你承不承認無所謂,普遍認知這種情況就是linking error
05/01 20:24, 49F

05/01 20:59, 6年前 , 50F
總之無關編譯時間長短 也無關佔用空間 就是會error
05/01 20:59, 50F

05/03 06:51, 6年前 , 51F
某 K 笑死,和編譯時間無關?連語法錯誤都出來了 XDDDD
05/03 06:51, 51F

05/03 09:02, 6年前 , 52F
false imply true 一個一定會error的東西不管說有沒
05/03 09:02, 52F

05/03 09:03, 6年前 , 53F
有關影響編譯時間長短和佔用空間都對
05/03 09:03, 53F

05/03 09:05, 6年前 , 54F
這兩篇從頭到尾都是在問什麼情況不行 結果一堆人都
05/03 09:05, 54F

05/03 09:05, 6年前 , 55F
在回覆編譯時間和佔用空間
05/03 09:05, 55F

05/03 09:06, 6年前 , 56F
還有人回可以這樣做唷^.<
05/03 09:06, 56F

05/03 09:06, 6年前 , 57F
誰在搞笑?
05/03 09:06, 57F

05/03 23:40, 6年前 , 58F
首先,compile errer 代表 source 不能被 compile 成 bin
05/03 23:40, 58F

05/03 23:40, 6年前 , 59F
ary,不代表這份 source 是邏輯上的 false
05/03 23:40, 59F

05/03 23:40, 6年前 , 60F
第二,不一定會 compile error
05/03 23:40, 60F

05/03 23:40, 6年前 , 61F
第三,兩篇都是問為什麼要這麼做
05/03 23:40, 61F

05/03 23:40, 6年前 , 62F
最後,你在別人的分享下面討論其他篇文章,不知道是誰在
05/03 23:40, 62F

05/03 23:40, 6年前 , 63F
搞笑?
05/03 23:40, 63F

05/04 06:57, 6年前 , 64F
就說是連結時期一定會炸 沒有炸就是因為沒連結
05/04 06:57, 64F

05/04 06:57, 6年前 , 65F
還在compile....
05/04 06:57, 65F

05/04 06:59, 6年前 , 66F
跟compile time一點關係都沒有 不知道要說幾次大家
05/04 06:59, 66F

05/04 06:59, 6年前 , 67F
才會知道linker的存在
05/04 06:59, 67F

05/04 07:00, 6年前 , 68F
linker根本邊緣人 幫qq
05/04 07:00, 68F

05/04 07:01, 6年前 , 69F
隨便都有一堆不會炸的例子,請說明如何一定會炸?沒炸的
05/04 07:01, 69F

05/04 07:01, 6年前 , 70F
話手動把他炸了嗎 XDDDD
05/04 07:01, 70F

05/04 07:01, 6年前 , 71F
"有甚麼情況下是必須要這樣做?" 這行看不到?
05/04 07:01, 71F

05/04 07:03, 6年前 , 72F
所以是再問為什麼要這麼做啊 有問題嗎
05/04 07:03, 72F

05/04 07:05, 6年前 , 73F
所以答案就是1F的linking時期error
05/04 07:05, 73F

05/04 07:06, 6年前 , 74F
又要開始講和 compile time 沒關係了嗎
05/04 07:06, 74F

05/04 07:06, 6年前 , 75F
單一檔案語法正確可以編譯 當然沒有編譯時期error
05/04 07:06, 75F

05/04 07:08, 6年前 , 76F
然後因為這樣正確就跑來說編譯沒錯
05/04 07:08, 76F

05/04 07:08, 6年前 , 77F
廢話當然編譯沒錯啊 根本就跟編譯無關
05/04 07:08, 77F

05/04 08:16, 6年前 , 78F
平心而論K君除了有一點(無傷大雅)的錯誤用詞,他說
05/04 08:16, 78F

05/04 08:16, 6年前 , 79F
的是正確的。整件事的癥結根本就在linking。
05/04 08:16, 79F

05/04 12:57, 6年前 , 80F
K 君大致上來講是沒錯啊,但是其他人講的是為什麼一開始要
05/04 12:57, 80F

05/04 12:58, 6年前 , 81F
這樣設計,但是K君一直想把問題簡化。大概就是懶人包跟來
05/04 12:58, 81F

05/04 12:59, 6年前 , 82F
龍去脈的差別吧...
05/04 12:59, 82F

05/04 14:41, 6年前 , 83F
都是原 po 不好 XD
05/04 14:41, 83F
文章代碼(AID): #1Qu_5g92 (C_and_CPP)
文章代碼(AID): #1Qu_5g92 (C_and_CPP)