2 patient pxw patient_pxw 于 2016.03.31 21:45 提问

小白求教C语言头文件和源文件的关系

书上说头文件一般只有声明,比如void func(void);
函数的定义则是在源文件中,那也就是说我新建的项目要使用以前项目中写过的一些函数(有相关头文件含有它们的声明),光靠把相关头文件#include进来是没用的喽?

可是为什么像stdio.h这样的可以不用包含它的源文件呢?

6个回答

qq423399099
qq423399099   Ds   Rxr 2016.03.31 21:51

stdio.h的实现在stdlib里,封装起来了,不能通过文本格式打开,防止被修改!
很多函数只提供给你头文件(相当于接口,只给用户使用),而没有具体实现的源代码
(一是防止修改,二是有些源代码可是公司核心竞争力啊,怎么可能让用户看)
而那些.c和.cpp都会被编译成库(lib,dll等),这些库被放在系统能找到的路径下,楼主只要包含头文件,
具体的实现程序会自己去这些目录下找对应的库

CSDNXIAOS
CSDNXIAOS   2016.03.31 21:52

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:

1.预处理阶段 
2.词法与语法分析阶段 
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用......
答案就在这里:C语言中,头文件和源文件的关系
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

sinat_24303319
sinat_24303319   2016.03.31 21:53

也可以定义在头文件中

pppploi8
pppploi8   2016.03.31 22:08

在我的理解里头文件就是源文件
在编译之前,编译器会把头文件内容展开到源文件里
而声明是告诉编译器,有这个函数/变量,但是不在这里,你去别的地方找。最后在链接的时候会在其他文件找到对应实现,然后把最终地址替换过去
鉴于编译器会把头文件替换到具体文件里,为了方便编译器查找,对于内联函数其实应该直接定义在头文件
然而需要在外部文件定义的内容,则在头文件定义声明,需要使用的时候include,最终由编译器负责找到具体实现链接在一起
头文件应该是可以放置任意C语言代码的,本质上和源文件没多大区别,只不过头文件设计出来的目的是为了方便引用其他文件代码,所以应该只放声明,内联代码,宏定义等内容

最后,对C了解不多,有说错请指出←u←

u010395948
u010395948   2016.03.31 22:32

向stdio.h这样的库文件之所以不用添加相应的实现文件(即.c文件)到工程中,是因为,你的整个项目在编译的过程中,编译器首先搜索一些固定的位置
(也就是所谓的库文件路径),会根据你所添加的库文件名,将库文件所对应的实现文件编译成的链接库放到工程中,所以库文件是不需要在工程中,
添加相应的实现文件的,但是自己写的.h和.c文件由于编译器的默认搜索路径中没有你以前写的那些文件在,所以会报错,这时候,编译器就会到你项目
的工程目录下搜索,如果有的话,就不会出现问题。。
也就是,项目在编译的时候,编译器首先在Library_path下搜索,然后在工程路径下搜索。。。

u010395948
u010395948   2016.03.31 22:33

如果你修改编译器的默认搜索路径的话,将自己写好的一些.h和.c所在的路径,加入到搜索路径中的话,你也就只需要在工程代码中包含.h名即可,
就不用将以前写的东西也放到工程项目中了。。。。。。。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!