Lastor
coding 嘗試 C++ 的 include 來拆分檔案,結果瘋狂報錯。一下跟我說重複定義,一下跟我說甚麼 linker command failed
Lastor
目前只知道 include 的概念不同於 JS ESM / CJS,他是編譯語法,會把 include 的檔案內容,直接 copy 進來貼上
Lastor
我只是寫了一個 console.log 的 funcion,搬到另一個 .cpp 然後 include 進來,這樣也報錯!?
Lastor
多寫一個 .h 改拉 .h 就 work 了
Lastor
也就是本質上其實不能 include .cpp 嗎
Lastor
chatGPT 騙我
Lastor
話說去 google C++ 拆分檔案,結果出來一堆都是教你怎麼把一個 pdf 或是 txt 檔案拆分
Lastor
我不是要這種拆分啊 (翻桌
Lastor
結果查 C++ module,就查到 C++ 20 好像有新特性,可以用 export / import 了
l• ܫ•) Davyキュルッ
可以 include 任意檔案
但你要考慮會不會讓函數的 body 重複

例如在 a.cpp 寫了一個 function foo
結果你在 b.cpp include a.cpp 然後又同時編譯
gcc a.cpp b.cpp 最後的結果就會變成原本 a.cpp 裡面就有 foo 的實作了,b.cpp 裡面又有一份,然後你又放一起編譯,當然會重複了
獨立寫成 header 的好處就是只複製(include)定義而不會複製到實作
Lastor
l• ܫ•) Davyキュルッ : 啊啊,難怪。我沒理解錯的話,因為我現在是用線上 IDE,我猜他是編譯所有 root 底下的檔案,沒得選。所以最終變成 a.cpp 本身編譯了一次,其他檔案的 include 那行又編譯了一次,就重複了
Lastor
這樣似乎我自己在本地跑編譯,不編譯 a.cpp 的話,理論上就會 work 了
l• ܫ•) Davyキュルッ
對的
Lastor
哦好,我知道了。這個編譯器,或是說 build tool 的工作方式跟 webpack / vite 不同。JS 這邊在 src 資料夾下,只有進入點,以及在進入點裡面有 import 的檔案才會被編譯
Lastor
但 C++ 這邊不同,如果編譯器設定了 src 資料夾,預設行為是沒有進入點這種玩意的,所有的 .cpp 都會被編譯,才導致這種現象
Lastor
這樣的話.... 連這行 include <iostream> 怎麼防止重複,應該也是有講究的
Lastor
好麻煩啊~~
l• ܫ•) Davyキュルッ
這行重複沒關係
因為他只有定義 沒有實作
Lastor
l• ܫ•) Davyキュルッ : 有,實際嘗試之後有發現,重複 incldue 預設模組沒問題,反倒是不 incldue 的話,該檔案一使用到該模組的東西,直接跑出紅線提示,非得 include 不可
l• ܫ•) Davyキュルッ
畢竟是內建的肯定是 follow best practice 的嘛
載入新的回覆