打印

问一个关于C的问题

[复制链接]
1309|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LittleSnowBall|  楼主 | 2014-5-19 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 LittleSnowBall 于 2014-5-20 21:26 编辑

有两个.c文件a.c,b.c和一个.h文件,其中.h中声明了一个外部的函数func1,func1定义在b.c中;
现在a.c中声明包含.h文件,但是b.c中没有声明包含.h文件,
请问func1能被a.c正确调用么?
PS:以前认为b.c中要声明.h才能用,但是现在发现别人这样用也行,求指教

相关帖子

沙发
lgdjade| | 2014-5-19 22:20 | 只看该作者
ding

使用特权

评论回复
板凳
lbc___| | 2014-5-19 23:10 | 只看该作者
可以这么用的

使用特权

评论回复
地板
LittleSnowBall|  楼主 | 2014-5-19 23:18 | 只看该作者
lbc___ 发表于 2014-5-19 23:10
可以这么用的

能做下解释么?,谢谢

使用特权

评论回复
5
zyj9490| | 2014-5-19 23:23 | 只看该作者
b.c自已定义的函数要申明吗?最多是警告而已,最叫做内部调用,最好函数体定义要写在调用之前。

使用特权

评论回复
6
ZhangStudy| | 2014-5-20 07:42 | 只看该作者
b.c包含.h文件的作用是让编译器检查func1的声明和b.c中的实现是否一致。如果你能自己保证一致,不包含.h没有任何问题。
建议b.c包含以下.h,让编译器替你检查。

使用特权

评论回复
7
loliweive| | 2014-5-20 10:05 | 只看该作者
可以这么用,a.c没有func1的定义,所以需要包含.h进行声明,b.c已有func1的定义,直接调用就行了。
一家之见~~~

使用特权

评论回复
8
LittleSnowBall|  楼主 | 2014-5-20 21:09 | 只看该作者
ZhangStudy 发表于 2014-5-20 07:42
b.c包含.h文件的作用是让编译器检查func1的声明和b.c中的实现是否一致。如果你能自己保证一致,不包含.h没 ...

那编译器是如何通过声明的函数func1,和b.c中定义的函数连接起来的?整个工程逐个查找?

使用特权

评论回复
9
LittleSnowBall|  楼主 | 2014-5-20 21:11 | 只看该作者
loliweive 发表于 2014-5-20 10:05
可以这么用,a.c没有func1的定义,所以需要包含.h进行声明,b.c已有func1的定义,直接调用就行了。
一家之 ...

也许我的表达有歧义,我问题的核心应该是编译器如何将声明的func1和b.c中的func对应起来?,整个工程逐个查找?

使用特权

评论回复
10
叶伤| | 2014-5-20 21:24 | 只看该作者
顺序包含,比如
#include "a.c"
#include "b.c"
这时候就可以在b.c里运用a.c的东西。

你这里b.c里直接调用func1能有什么问题。func1本来就是b.c的。

使用特权

评论回复
11
ZhangStudy| | 2014-5-21 10:47 | 只看该作者
LittleSnowBall 发表于 2014-5-20 21:09
那编译器是如何通过声明的函数func1,和b.c中定义的函数连接起来的?整个工程逐个查找? ...

定位符号是发生在连接操作。编译时只需要知道符号(这个函数就是一个符号)的语法特点就行了。
连接时,整个工程所有.c程序使用的外部符号都必须找到,否则连接会失败的。

使用特权

评论回复
12
lanmp| | 2014-5-21 12:58 | 只看该作者
没有.h都一样用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

321

帖子

2

粉丝