作者timrau (有code還是沒真相)
看板EE_DSnP
標題Re: [問題] 有關於extern要怎麼用
時間Sat Oct 18 23:46:37 2008
※ 引述《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
1F:推 wintercobra:在b裡面編譯的時候,#include把a的程式碼抄進來 10/19 00:08
2F:→ wintercobra:那當他要找function_a的時候,不就只有一份嗎? 10/19 00:09
3F:→ wintercobra:在b裡面已經貼上的那一份,會去管a裡面有什麼嗎? 10/19 00:10
4F:→ wintercobra:如果執行b時只看b的程式碼而不管a的話,怎會存在兩份? 10/19 00:10
5F:→ timrau:所以是在linker的時候才出問題啊.....compile沒問題 10/19 00:38
6F:→ timrau:當然如果你是用類似g++ b.cpp的方式compile 不會有問題 10/19 00:39
7F:→ timrau:但那麼多.cpp檔 如果照正常的方法 全部都compile & link 10/19 00:39
8F:→ timrau:就掛掉囉 10/19 00:39