C语言文件包含相关问题 10
本人菜鸟,请教c语言文件包含的问题,请大家指点。问题如下:如果有三个文件(main.ca.ca.h);a.c中#include<a.h>;main.c中#include<...
本人菜鸟,请教c语言文件包含的问题,请大家指点。
问题如下:如果有三个文件(main.c a.c a.h);a.c中#include <a.h>;main.c中#include <a.h>;main.c中也用到a.c中得函数;那么编译器开始编译时详细顺序是怎么样的。
1、看了谭浩强老师和网站上的内容,要不是单纯包含,就是过于复杂的编译原理,没有解决。
2、我猜想是先从main.c开始,检查main.c中文件包含情况,然后把包含的文件编译进main.c,但是别的包含了a.h的a.c如何编译。
3还是这种包含方式不科学。请推荐几本文件包含方法、规则、和原理的书籍文章。
再次感谢
1、就这道题而言,因为我理解的是把a.h先和main.c编译到一起成为一个中间文件,然后a.h和a.c编译到一起成文一个中间文件,那这两个中间文件怎么编译到一起成文一个大文件。谢谢各位的回答。
2、是不是可以理解为,先编译其他的c文件,最后编译main.c?
3、比如main.c里面包含了一个.h文件,编译的时候,从main.c里面的头文件开始编译,编译到那个.h时候,其他所有包含这个.h的c文件都会编译进来?
4、或者是不是可以这样理解:比如有1.h和2.h,编译器开始编译的时候会把所有的和1.h相关的函数编译到一起,2.h相关的函数编译到一起,最后再检查相关关系? 展开
问题如下:如果有三个文件(main.c a.c a.h);a.c中#include <a.h>;main.c中#include <a.h>;main.c中也用到a.c中得函数;那么编译器开始编译时详细顺序是怎么样的。
1、看了谭浩强老师和网站上的内容,要不是单纯包含,就是过于复杂的编译原理,没有解决。
2、我猜想是先从main.c开始,检查main.c中文件包含情况,然后把包含的文件编译进main.c,但是别的包含了a.h的a.c如何编译。
3还是这种包含方式不科学。请推荐几本文件包含方法、规则、和原理的书籍文章。
再次感谢
1、就这道题而言,因为我理解的是把a.h先和main.c编译到一起成为一个中间文件,然后a.h和a.c编译到一起成文一个中间文件,那这两个中间文件怎么编译到一起成文一个大文件。谢谢各位的回答。
2、是不是可以理解为,先编译其他的c文件,最后编译main.c?
3、比如main.c里面包含了一个.h文件,编译的时候,从main.c里面的头文件开始编译,编译到那个.h时候,其他所有包含这个.h的c文件都会编译进来?
4、或者是不是可以这样理解:比如有1.h和2.h,编译器开始编译的时候会把所有的和1.h相关的函数编译到一起,2.h相关的函数编译到一起,最后再检查相关关系? 展开
2个回答
2015-03-17
展开全部
两个 .c 文件没有包含关系的话,编译器当然是分别编译两个 .c 文件。这里把编译器生成的文件称为 .obj 文件,.obj 文件中不需要有所有用到的函数的定义
链接的时候需要告诉链接器两个 .obj 文件之间有引用关系,这样链接器就会把两个 .obj 文件组合起来,形成完整的程序,此时所有用到的函数都必须有定义,否则就会有链接期错误
至于要编译哪些文件,哪些文件需要链接在一起,必须告诉 编译器/链接器,可以是手动(通过命令行)告诉,也可以利用配置文件,或 IDE 自动生成……
链接的时候需要告诉链接器两个 .obj 文件之间有引用关系,这样链接器就会把两个 .obj 文件组合起来,形成完整的程序,此时所有用到的函数都必须有定义,否则就会有链接期错误
至于要编译哪些文件,哪些文件需要链接在一起,必须告诉 编译器/链接器,可以是手动(通过命令行)告诉,也可以利用配置文件,或 IDE 自动生成……
追问
请好好看题,只是预编译阶段,还没有进行编译!
追答
main.c 和 a.c 又没有 #include 的关系,预编译阶段根本与此无关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个很简单的就是肯定首先从main函数的文件开始执行,a.c里面不能包含main函数,只是作为头文件的执行模块,被main函数直接调用!!!
追问
.h好像是与编译,所以最先开始,那是从main.c里面的.h先开始编译吗,还是多线程的同时编译各个.h?编译.h的时候是不是同时搜索所有包含了这个.h的c文件中得函数?有编译顺序吗?形成obj之前?
追答
.h不是编译,只是在你编译main函数的这个文件的时候,编辑器会自动检查一下你的头文件是否存在,如果不存在就会报错,这不是编译的过程,当从main函数开始执行的时候,用到了.h里面的东西的时候,会根据事前检查.h文件的时候之间从这个路径获取对应的代码块执行,换句话说只有在main函数里面用到了.h文件,.h里面对应的代码块才进行编译,相反就没用!!!
.h里面只是简单的函数原型声明,没有执行函数原型的代码!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询