看板 EE_DSnP 關於我們 聯絡資訊
※ 引述《bonoshi (sbo)》之銘言: : 推 wintercobra:同樣的func. def.多抄幾遍是什麼意思啊? 10/18 19:30 : → wintercobra:而且不是有<XXX.h>和<XXX.c>兩種方式嗎?撞前面的名字? 10/18 19:32 For example, before preprocessing // a.cpp int function_a(void) { return 123; } // b.cpp #include "a.cpp" // 錯誤示範 int main(void) { int result = function_a(); return 0; } After preprocessing (all #include were handled) // In a.cpp int function_a(void) { return 123; } // In b.cpp int function_a(void) { return 123; } //#include 就是照抄一遍放進來 //而且compiler不會知道它是從a.cpp抄來的 //只知道這裡就是有定義function_a() int main(void) { int result = function_a(); return 0; } Compile完畢,linker工作時,會看到這些東西: int function_a(void)的object code (來自處理完的a.cpp) int function_a(void)的object code (來自處理完的b.cpp) int main(void)的object code 首先找到main() 進去,發現需要function_a() 結果居然存在兩份int function_a(void) 這下麻煩大了,不知道該link到哪一份function_a()才對 (縱然他們內容應該要一模一樣,如果編譯參數沒變、運氣很好的話) 於是就linker error,開始艱辛的debug過程... -- linker error比compile error難搞太多了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.5.50
wintercobra:在b裡面編譯的時候,#include把a的程式碼抄進來 10/19 00:08
wintercobra:那當他要找function_a的時候,不就只有一份嗎? 10/19 00:09
wintercobra:在b裡面已經貼上的那一份,會去管a裡面有什麼嗎? 10/19 00:10
wintercobra:如果執行b時只看b的程式碼而不管a的話,怎會存在兩份? 10/19 00:10
timrau:所以是在linker的時候才出問題啊.....compile沒問題 10/19 00:38
timrau:當然如果你是用類似g++ b.cpp的方式compile 不會有問題 10/19 00:39
timrau:但那麼多.cpp檔 如果照正常的方法 全部都compile & link 10/19 00:39
timrau:就掛掉囉 10/19 00:39