不#include <stdio.h> 能调用printf吗?解密extern关键字的奥秘!

我们在第一节的时候,标准的写法是 #include <stdio.h>,然后我们就可以用printf函数了。

C语言必须写main函数?最简单的 Hello world 你其实一点都不懂!

这里说下我当前用的系统,讲解课程我用的是 VBox+ubuntu12.04,没有用vm的原因很简单,我买的这个电脑,用vm只要暂停下就退不出去了,卡死了。

我们后面开发项目,会用 Linux系统 和 vs windows系统,两边都会出一套教程,来学习掌握如何开发项目。

那么我们如果不导入这个#include,是否还能用呢?其实是可以的,而且很简单,具体的写法是:

我们编译,最终也是可以通过的,并且是可以执行的。我们今天就来说下这个原因。

main函数是入口函数,这个我们第一讲说了,这个就是一个规定,一个约定,当我们写汇编代码时候,默认的是_start这个标签。这个就是一个约定,系统给你指定好该怎么写,如此系统才知道你不是?

我们这里的printf,前面用 extern 这个关键字,它的意思是什么呢?是我们有个这样的函数,这个函数不是我写的,但是我要用,我先声明下它在外面,当我们链接的时候要从外面找,找不到就会出错。

所以这里编译的时候,就知道嗯,这里有个printf我们先按照这个声明去解析它,把我文件中用到的地方,用这个解析出来,解析完了,到链接的这个步骤,去找下外面有没有哪个动态库,或者静态库有这个函数的实现,如果有,就链接成功,否则就提示未定义的符号,报错结束。

这个就是extern,我们可以理解成这个就是给本文件说,这个函数我没有,但是外面有人帮我做好了,你先按照我的声明去做,后面链接时候会找到的。

为什么extern要放在应用它的前面,就是编译器在解析的时候,它要知道声明,它是按照这个来进行语法解析,做参数和堆栈的。如果你放到后面,那么前面的printf就不知道,所以就会报错。

我们用系统默认会引用的库去测试不规范,我们自己写一个方法,来看下这个玩意怎么玩。

add.c :

我们把add函数实现放到这里。add.h,写上这个函数的声明,

我们先把这个编译成.o和.a 。

gcc -o add.o -c add.c

ar cr libadd.a add.o 

这样子我们就有一个.h 和一个.a静态库了。

然后我们改下hello.c,引入add.h,调用add函数。

我们使用gcc -o hello hello.c 就会报错,未定义的add,原因是我们找不到它的实现。

我们换一下,先把它变成.o,这个过程还没去找外部声明的函数,所以能够编过。这里命令是:

gcc -o hello.o -c hello.c

下来就是关键的,我们知道了.c变化到.o的时候,还没有去找外部的变量,和函数,但是链接的时候就需要找了,这时候我们可以这样操作。

gcc add.o hello.o -o hello

这样子就是可以找到的,因为add.o里面有add函数,只是这个不是常规的方法,我们一般从三方拿到的是,静态库,因为.o会有很多,不可能给你很多.o去用,所以都是把这些打包在一起,就是静态库了,同时再给你一堆头文件去调用。

这里我们要用的话,是这样操作。

gcc hello.o -o hello -L./ -Iadd

-L说的是,静态库可以从这里查找,-I说的是我们要加入的静态库,这里-Iadd 指的是libadd.a,系统把这个进行了约定,做了简写。

这样子你就能明白,你在用include最终都是做了什么,具体用到了什么,能够直接厘清它,从而不被所谓的库扰乱,知道系统库就是一些实现好的函数,然后给出一堆头文件去选择,然后gcc编译默认会把这些库包含进来,所以我们不知道,搞的迷茫。

于是这一讲用自己实现一个静态库的方式,让大家看清它的真实面目,这一节引入了一个关键字,就是extern,下一节我们说下动态库,然后讲下这里的静态库和动态库的区别,C语言的路线很长,也比较跳跃,如果没看懂的,欢迎留言!

喜欢,帮忙转发~~

~~ end not end ~~

热门文章

零基础新手自学Python编程教程入门精通学习资料网站大全

自学编程C语言不迷路,我私藏的书单分享给你!

零基础新手学习算法Leetcode刷题指南

程序员码农IT工程师自学编程计算机入门进阶学习网站大全

程序员面试题宝典以及相关书籍下载!

计算机类常用电子书整理大全

职场老鸟,互联网十年从业生涯,分享 [Java,Python,安卓,AI,爬虫] 技术文章,学习资料, 热点趣闻等。关注回复 1024 Python 电子书大全 面试资料,给你一份私藏的程序员好礼,永远更新中!赶紧来关注哦!

我的微信 code_gg_boy 。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员入门进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值