作者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