问一个关于C的问题

[复制链接]
1641|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 | 显示全部楼层
lbc___ 发表于 2014-5-19 23:10 | 显示全部楼层
可以这么用的
 楼主| LittleSnowBall 发表于 2014-5-19 23:18 | 显示全部楼层
lbc___ 发表于 2014-5-19 23:10
可以这么用的

能做下解释么?,谢谢
zyj9490 发表于 2014-5-19 23:23 | 显示全部楼层
b.c自已定义的函数要申明吗?最多是警告而已,最叫做内部调用,最好函数体定义要写在调用之前。
ZhangStudy 发表于 2014-5-20 07:42 | 显示全部楼层
b.c包含.h文件的作用是让编译器检查func1的声明和b.c中的实现是否一致。如果你能自己保证一致,不包含.h没有任何问题。
建议b.c包含以下.h,让编译器替你检查。
loliweive 发表于 2014-5-20 10:05 | 显示全部楼层
可以这么用,a.c没有func1的定义,所以需要包含.h进行声明,b.c已有func1的定义,直接调用就行了。
一家之见~~~
 楼主| LittleSnowBall 发表于 2014-5-20 21:09 | 显示全部楼层
ZhangStudy 发表于 2014-5-20 07:42
b.c包含.h文件的作用是让编译器检查func1的声明和b.c中的实现是否一致。如果你能自己保证一致,不包含.h没 ...

那编译器是如何通过声明的函数func1,和b.c中定义的函数连接起来的?整个工程逐个查找?
 楼主| LittleSnowBall 发表于 2014-5-20 21:11 | 显示全部楼层
loliweive 发表于 2014-5-20 10:05
可以这么用,a.c没有func1的定义,所以需要包含.h进行声明,b.c已有func1的定义,直接调用就行了。
一家之 ...

也许我的表达有歧义,我问题的核心应该是编译器如何将声明的func1和b.c中的func对应起来?,整个工程逐个查找?
叶伤 发表于 2014-5-20 21:24 来自手机 | 显示全部楼层
顺序包含,比如
#include "a.c"
#include "b.c"
这时候就可以在b.c里运用a.c的东西。

你这里b.c里直接调用func1能有什么问题。func1本来就是b.c的。
ZhangStudy 发表于 2014-5-21 10:47 | 显示全部楼层
LittleSnowBall 发表于 2014-5-20 21:09
那编译器是如何通过声明的函数func1,和b.c中定义的函数连接起来的?整个工程逐个查找? ...

定位符号是发生在连接操作。编译时只需要知道符号(这个函数就是一个符号)的语法特点就行了。
连接时,整个工程所有.c程序使用的外部符号都必须找到,否则连接会失败的。
lanmp 发表于 2014-5-21 12:58 | 显示全部楼层
没有.h都一样用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

321

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部