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

看板C_and_CPP作者時間6年前 (2018/04/27 22:10), 編輯推噓6(6027)
留言33則, 5人參與, 6年前最新討論串1/3 (看更多)
※ [本文轉錄自 Programming 看板 #1QuouicF ] 作者: DIE755127 () 看板: Programming 標題: [問題] 請問C介面跟實作分開的作法 時間: Fri Apr 27 22:05:30 2018 通常一般的習慣a.c會去include a.h a.c是實作內容 a.h是介面宣告 b.c只需要include a.h就可以使用a的function 但實際上把a.c include a.h的內容拿掉 編譯過程link也不會發生問題(雖然這樣看起來a.c跟a.h就沒有直接關連) 當然如果a.h內還有定義一些struct或常數會被a.c用到 include a.h就是必須的 不過在不考慮上述的情況下 是否a.c要不要去include a.h只剩下coding習慣的問題? 編譯過程上沒有任何差別? 第二個問題是 去include一個.c檔是絕對必須避免的嗎? 有甚麼情況下是必須要這樣做?(因為有看到有人這樣寫 但覺得不太合常理) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.233.122 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1524837932.A.98F.html ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: DIE755127 (1.163.233.122), 04/27/2018 22:10:39

04/27 22:19, 6年前 , 1F
可以先宣告原型再實作
04/27 22:19, 1F

04/27 22:20, 6年前 , 2F
每個binary只能有一組宣告+實作
04/27 22:20, 2F

04/27 22:21, 6年前 , 3F
如果a.c編譯成a.o 有沒有include a.h就是差原型宣告
04/27 22:21, 3F

04/27 22:22, 6年前 , 4F
如果include a.c 之後只要這個區塊被include兩次
04/27 22:22, 4F

04/27 22:23, 6年前 , 5F
就會變成一個binary裡面有兩份實作 自然會編譯失敗
04/27 22:23, 5F

04/27 22:26, 6年前 , 6F
未include a.h的a.o會失敗的情況是 如果改a.h原型
04/27 22:26, 6F

04/27 22:27, 6年前 , 7F
因為a.c不知道a.h有變 之後link自然會失敗
04/27 22:27, 7F

04/27 22:28, 6年前 , 8F
為什麼要用各式各樣可能會炸的方法寫程式咧?
04/27 22:28, 8F

04/27 22:32, 6年前 , 9F
感謝回應 我自己不會這樣寫 只是trace別人的code看到
04/27 22:32, 9F

04/27 22:43, 6年前 , 10F
不過介面改變 有沒有include變成一個是compile出錯
04/27 22:43, 10F

04/27 22:43, 6年前 , 11F
另一個是link出錯 不曉得這樣理解對嗎
04/27 22:43, 11F

04/27 22:45, 6年前 , 12F
未來改a.h的時候 因為a.c不會跟上 所以之後對不上
04/27 22:45, 12F

04/27 22:46, 6年前 , 13F
靜態連結是compiler時期找不到實作
04/27 22:46, 13F

04/27 22:47, 6年前 , 14F
動態連結是執行時期炸掉
04/27 22:47, 14F

04/27 22:51, 6年前 , 15F
不過就結果來說都是會出問題 好像跟include的關係不大?
04/27 22:51, 15F

04/27 22:53, 6年前 , 16F
我自己認知是覺得比較容易影響trace code的直覺性
04/27 22:53, 16F

04/27 22:59, 6年前 , 17F
只要能執行就都是合法語法阿 問題是擴充可讀維護性
04/27 22:59, 17F

04/27 23:32, 6年前 , 18F
會這樣問是看到一個c檔沒有include任何header只有一堆f
04/27 23:32, 18F

04/27 23:32, 6年前 , 19F
unction 但也不是static function 就搞不太清楚這個c
04/27 23:32, 19F

04/27 23:32, 6年前 , 20F
檔的目的是什麼 結果別的c檔靠著 include分離的header(
04/27 23:32, 20F

04/27 23:32, 6年前 , 21F
介面一樣)去link他
04/27 23:32, 21F

04/27 23:34, 6年前 , 22F
全都是 static function 才奇怪吧 XD
04/27 23:34, 22F

04/27 23:37, 6年前 , 23F
對啦 至少要有一個不是 其他static就是為他服務這樣
04/27 23:37, 23F

04/27 23:40, 6年前 , 24F
沒 include 就 call 你會遇到 implicit declaration of
04/27 23:40, 24F

04/27 23:40, 6年前 , 25F
function。然後堆疊有機會爆炸
04/27 23:40, 25F

04/27 23:52, 6年前 , 26F
我看到另個寫法是a.c a.h沒關聯 b.c去include a.c&a.h
04/27 23:52, 26F

04/27 23:53, 6年前 , 27F
這樣只需要編譯b.o 其他要使用的人include a.h
04/27 23:53, 27F

04/27 23:54, 6年前 , 28F
這種寫法是不是也不太好?
04/27 23:54, 28F

04/28 01:32, 6年前 , 29F
a.h其實不是給a.c使用,而是給其他需要a.c的人使用的
04/28 01:32, 29F

04/28 02:12, 6年前 , 30F
include .c 就 redefinition
04/28 02:12, 30F

04/28 09:40, 6年前 , 31F
1.不include 自己的header 就是爛習慣,不討論。2.可以
04/28 09:40, 31F

04/28 09:40, 6年前 , 32F
的話應避免 include 別的header ->yes , 能用 forward d
04/28 09:40, 32F

04/28 09:40, 6年前 , 33F
eclaration 就能解的就不要include
04/28 09:40, 33F
文章代碼(AID): #1QuozWpI (C_and_CPP)
文章代碼(AID): #1QuozWpI (C_and_CPP)