问题描述
- 小白求教C语言头文件和源文件的关系
-
书上说头文件一般只有声明,比如void func(void);
函数的定义则是在源文件中,那也就是说我新建的项目要使用以前项目中写过的一些函数(有相关头文件含有它们的声明),光靠把相关头文件#include进来是没用的喽?可是为什么像stdio.h这样的可以不用包含它的源文件呢?
解决方案
stdio.h的实现在stdlib里,封装起来了,不能通过文本格式打开,防止被修改!
很多函数只提供给你头文件(相当于接口,只给用户使用),而没有具体实现的源代码
(一是防止修改,二是有些源代码可是公司核心竞争力啊,怎么可能让用户看)
而那些.c和.cpp都会被编译成库(lib,dll等),这些库被放在系统能找到的路径下,楼主只要包含头文件,
具体的实现程序会自己去这些目录下找对应的库
解决方案二:
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:
1.预处理阶段?
2.词法与语法分析阶段?
3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)
4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用......
答案就在这里:C语言中,头文件和源文件的关系
解决方案三:
也可以定义在头文件中
解决方案四:
在我的理解里头文件就是源文件
在编译之前,编译器会把头文件内容展开到源文件里
而声明是告诉编译器,有这个函数/变量,但是不在这里,你去别的地方找。最后在链接的时候会在其他文件找到对应实现,然后把最终地址替换过去
鉴于编译器会把头文件替换到具体文件里,为了方便编译器查找,对于内联函数其实应该直接定义在头文件
然而需要在外部文件定义的内容,则在头文件定义声明,需要使用的时候include,最终由编译器负责找到具体实现链接在一起
头文件应该是可以放置任意C语言代码的,本质上和源文件没多大区别,只不过头文件设计出来的目的是为了方便引用其他文件代码,所以应该只放声明,内联代码,宏定义等内容
最后,对C了解不多,有说错请指出←u←
解决方案五:
向stdio.h这样的库文件之所以不用添加相应的实现文件(即.c文件)到工程中,是因为,你的整个项目在编译的过程中,编译器首先搜索一些固定的位置
(也就是所谓的库文件路径),会根据你所添加的库文件名,将库文件所对应的实现文件编译成的链接库放到工程中,所以库文件是不需要在工程中,
添加相应的实现文件的,但是自己写的.h和.c文件由于编译器的默认搜索路径中没有你以前写的那些文件在,所以会报错,这时候,编译器就会到你项目
的工程目录下搜索,如果有的话,就不会出现问题。。
也就是,项目在编译的时候,编译器首先在Library_path下搜索,然后在工程路径下搜索。。。
解决方案六:
如果你修改编译器的默认搜索路径的话,将自己写好的一些.h和.c所在的路径,加入到搜索路径中的话,你也就只需要在工程代码中包含.h名即可,
就不用将以前写的东西也放到工程项目中了。。。。。。。