大学刚学C的时候,老师教的第一个C程序是打印出一个helloword字样,并告诉我们,要使用printf这个东西,C文件开头需要加上一句:#include"stdio.h"
这个语句是实现了什么动作?
后来学到C++,好像老师还是同学(记不清楚了)说了一句,#include 的作用是将目标文件的内容复制到该位置
再后来,学习到函数的定义和声音,老师教我们将函数的声明写在对应的.h文件中,再在对应的.c文件实现该函数的定义,我们需要用到该函数之时,只要将对应的.h文件用include语句包含进来即可。
那么问题来了,既然include只是将目标文件的内容复制到该区域,在预处理后的主程序结构中,将只会函数的声明包括进来,函数的具体定义呢?没有具体的定义,是如何实现函数的调用的?
今天看到一个帖子,终于对于C语言的编译过程有了些许了解,也解决了困扰我这么久的一个问题
第一:函数没有定义实现,编译不会有错但链接找不到实现会报错。
第二个:需要了解exe生成的原理((预处理->编译->汇编->链接);
1:预处理,就是处理文件包含(include),宏定义等替换的动作。 这里的#include 只是替换。
我们看到的库函数头文件一般只是声明,实现一般是生成dll文件。
2:编译 编译器对源代码进行编译,是将以文本形式存在的源代码翻译为机器语言形式的目标文件的过程
3:链接 把用到的外部的地址放到exe中。
使用动态连接编译,比如sprintf,生成的exe中只是简单的记录了当前sprinf函数的地址,只有当运行需要的时候才会到相应的dll中调用改函数的实现。
如果使用静态连接exe则会很大。
头文件包含声明, 库文件包含实现或者与DLL库的连接
如果在代码里要用到这些函数那么就要包含头文件,编译的时候才能知道函数的原形;
在进行代码连接的时候就需要库文件了,这时连接器就把函数的实现代码连接到你的程序(静态库)或者将你的函数调用连接到相应的DLL的对应函数(动态库) 。
微软一般是头文件名字是什么,lib文件也是什么 .怎么找的只有问微软了。