作者nowar100 (抛砖引玉)
站内C_and_CPP
标题Re: [问题] 请问函式读不到的问题
时间Fri Oct 23 02:00:54 2009
我把编译原理讲一下好了,这样你就知道了
假设今天你有两个档案
// sub.cpp
int sub(int a, int b) {
return a>b? a-b: b-a;
}
//main.cpp
int main(){
sub(5, 3);
}
在compile的时候,他会看看sub.cpp,发现了一个sub函式的定义
检查後确定无误,好,sub.cpp这档案编译完成
接下来看看main.cpp,他发现呼叫了sub这个函式,於是compiler会往上找
可是他在main.cpp里面怎麽往上找就是找不到sub的宣告
於是他跟你说他找不到这东西,停止编译
函式能被定义一次,但是可以宣告多次
宣告的意思就像是跟编译器说「你看我有这个东西」
所以我们通常如果把程式分多个档案写
会把函式宣告写到.h档里面,把定义写到一个.cpp就可以了
用意是要让大家可以透过#include看的到这函式即可
然後再把.cpp去#include这个.h
#include .h可以把他想成是他会把.h的东西放到cpp里面来
所以该例会变成
// main.h
int sub(int, int);
// sub.cpp
int sub(int a, int b){
return a>b? a-b: b-a;
}
// main.cpp
#include "main.h"
int main(){
sub(5, 3)
}
这样compiler在检查main.cpp的时候,发现他要呼叫到sub函式
他会往上看,这时候因为你有#include宣告,所以他会找到一个候选的sub函式
接着比对型别,型别一致,
编译器认定没问题,编译完成。
※ 引述《mulder1985 (老人)》之铭言:
: 请问一下大家
: 就是我的程式有写一些副函式
: 可是在compile的时候
: 会出现有些副函式"identifier not found"
: 但是有些却不会
: 请问这类情况要如何解决呢?
: 谢谢
--
文笔不是很好阿 叹~
一直想写一些基本的东西给新手好入门,像是pointer & array,overloading
不过写出来不清不处会让人更困惑吧 囧rz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.143.227
1F:→ VictorTom:推一下:) 10/23 02:09
2F:→ VictorTom:话说, 虽然说可以宣告多次, 不过是写宣告在不同档案里. 10/23 02:10
3F:→ VictorTom:在同一个.cpp如果能看到同样的宣告两次, 记得也是会 10/23 02:10
4F:→ VictorTom:error的....@_@" 10/23 02:10
5F:推 QQ29:不会error耶 VC的话 = = 10/23 02:12
6F:→ nowar100:不会耶 我刚也用gcc/g++试过 多次宣告没问题 10/23 02:14
7F:推 VictorTom:(大惊) 我记错了吗....@_@" 10/23 02:14
8F:推 VictorTom:对不起, 真的是我自己记错了....Orz 10/23 02:16
9F:→ VictorTom:非常抱歉, 可能是和会ambiguous的状况搞错了<(_ _)> 10/23 02:18
10F:→ nowar100:V大写过太多程式 所以搞混了 我也常这样 XD 10/23 02:18
11F:→ nowar100:ambiguous是多个候选版本但选不出结果 没记错的话XD? 10/23 02:18
12F:→ VictorTom:套一句网路上忘了哪里看来的文章里人家说的话.... 10/23 02:18
13F:→ VictorTom:等我写了几年的程式以後才发现, 其实我只是写了同样的程 10/23 02:19
14F:→ VictorTom:事写了好几年....Orz 10/23 02:19
15F:→ VictorTom:对啊~overloading写坏ambiguous时,compiler就会抱怨了XD 10/23 02:20
16F:→ nowar100:大家都是这样吧 然後就会在发现的这一刻实力提升了 XD 10/23 02:20
17F:→ VictorTom:可能的话, 人家比较想薪水提升一下啊....(泪奔Q_Q~) 10/23 02:21
18F:推 h520:原po的方法是教大家避免multiple definition吧 10/23 07:46
19F:推 QQ29:不是耶 重复定义 避免的方式 很多 10/23 12:27
20F:→ QQ29:这篇只是单纯讲一下 编译顺序而已... 10/23 12:27