c语言的文件包含问题

jianglifei 2008-12-08 09:27:27
请问大家知道c的源文件和同名头文件的关系吗?
文件到底是如何组织的呀?为什么比如说:我有3个文件,main.c,function.c,function.h,
在main.c里有语句:#include <function.h>;,
在function.c里也有语句:#include <function.h>;,
其中function.h里面是function.c里面的函数的申明,function.c里面是函数的定义。
main.c里调用了function.c里面定义的函数。
问题:
mian.c没有包含文件function.c,为什么main.c里面的主函数可以调用function.c里面的定义的函数?main.c里面不是只包含了函数的申明吗?
谢谢啊!
...全文
127 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mymtom 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 malu_1982 的回复:]
MARK

这个问题也困扰我很久了。

还有一个问题?

extern到底有什么作用?

好像不用extern和用extern是一样的。不同编程语言之间的调用。
[/Quote]
对函数来说extern不起任何作用, static 使得函数和变量不能被其他.c文件调用
extern 指示变量的定义在其他.c文件中。

static int foo(void)
{
}

static int b = 8;
extern int a;
int c = 9;
qlx1983 2008-12-09
  • 打赏
  • 举报
回复
extern 起到申明的作用,当在.h文件里用extern申明变量或是函数时,只用在任意使用的一个.c文件里重新初始化一下,即可当做全局变量或全局函数,在其他文件中被调。
wywanyong 2008-12-09
  • 打赏
  • 举报
回复
头文件在预编译阶段会嵌入进去,这样就可以用了
jqx_ah 2008-12-09
  • 打赏
  • 举报
回复
不错~! 楼上已经很清楚了
  • 打赏
  • 举报
回复
..up
xiaopoy 2008-12-09
  • 打赏
  • 举报
回复
extern定义的是符号命名方式.
比如c方式就是加个"_",c++方式还会带上参数、内部元素
well,编译原理是基础课程吧
malu_1982 2008-12-08
  • 打赏
  • 举报
回复
MARK

这个问题也困扰我很久了。

还有一个问题?

extern到底有什么作用?

好像不用extern和用extern是一样的。不同编程语言之间的调用。
malu_1982 2008-12-08
  • 打赏
  • 举报
回复
MARK

这个问题也困扰我很久了。

还有一个问题?

extern到底有什么作用?

好像不用extern和用extern是一样的。不同编程语言之间的调用。
lann64 2008-12-08
  • 打赏
  • 举报
回复
编译是可以分开编译的,每一部分单独形成一个obj文件,由link程序来组装成最后的执行文件。
编译main的时候,只需要知道function.h里声明了哪些变量、类型、函数等等。
编译function.c的时候也是一样。所以都只需要#include function.h就可以了。
sys0006 2008-12-08
  • 打赏
  • 举报
回复
你的工程里还有一个工程文件,VC6是.dsp,VS2003以后是.vcproj

那里面记录了你的工程包含的所有文件,所以编译时它自动会编译相应的.c文件
bfhtian 2008-12-08
  • 打赏
  • 举报
回复
如果在function.c存在一个函数没有在function.h声明,就会报错。
jianglifei 2008-12-08
  • 打赏
  • 举报
回复
谢谢你呀,yellowhwb,你不知道,你解决了我一直疑惑的问题,也让我对c工程的编译有了重新的理解!再说一声,谢谢呀!
yellowhwb 2008-12-08
  • 打赏
  • 举报
回复
首先,头文件的作用仅仅是给编译器提供一个信息,告诉编译器,有某些函数存在,或者c文件中的某些宏,inline函数要被替换,正真编译的时候,头文件是不要编译的。
其次所以的c文件最后都会被编译成object文件(.o,.obj等类似的文件),然后开始link,编译器会寻找每个函数的地址,如果能找到,那么编译就通过,如果找不到或者函数重名了,编译器就报错。
function.c生成的object是function.o,main.c生成的是工程名.o,当link的时候,function.c里的函数地址肯定能被找到。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧