Unix是C的作者开发的。
Unix附属诞生物,当时使用的是cc编译器
然后有了linux就封装成了gcc编译器,但由于考虑到老家伙的使用习惯,还保留了cc
C语言是结构化程序语言(一个程序能包含多个函数).C语言简单粗暴,主要由两大块组成,头文件和函数。
Nginx就是由C语言编写的比Apache性能优越。
关于VIM的使用:
:set nu (打开行号显示命令)
编辑c文件
直接编译命令$ cc hello.c
如果hello.c中需要引入其他文件中的函数
可以将目标文件先编译成编译成.o文件(二进制文件)$ gcc -c max.c -o max.o,然后编译$ gcc max.o hello.c (这样编译可以大大提高编译效率)
这样可以调用别人写的功能函数文件。但是当比人将自己写的c文件编译成了.o文件我们是看不到源码的,这时我们怎么知道使用方法呢?
解决方案:模仿.h文件的编写。在.h文件中描述用法,然后导入.h文件即可。
![](https://i-blog.csdnimg.cn/blog_migrate/55bb2e4fd8e1eef4493ce27ce33d5d18.png)
然后在主c文件中导入:
![](https://i-blog.csdnimg.cn/blog_migrate/289e92b0be8d3536a1f0c808ab1c5f94.png)
这时再$ gcc max.o min.o hello.c 即可完成编译。
这样做的优点: 提高编译效率,和代码完整性,以及工作上的解耦(分工合作)。
方便编译源代码:
上述我们使用cc/gcc命令编译源代码。但是问题来了,如果你的文件中导入了几千个别人写的.o文件那该怎么编译,一个个敲嘛?这显然是不可取的。针对这个问题,make工具就应运而生了。
先介绍一下make:
make是属于GUN项目的封装了gcc的批量自动编译工具,介绍完毕。
make的安装及使用:
sudo apt-get update 更新源
sudo apt-get install make
很多人写的文件组合起来需要编译及使用,先潜规则约定一个Makefile文件用于说明多个与本项目有关的文件,可以在里面写注释,里面的编写规则主要是按照make的规则,让它识别即可。
Makefile文件编码规则: tab缩进需6个空格的规格。如果是四个空格的缩进则make编译时会出现异常,并且缩进必须为tab,不能使用6个Space代替。
![](https://i-blog.csdnimg.cn/blog_migrate/8321a0a5e0fc491a4a2ef09e5d192c91.png)
Makefile一行一行的读,如果碰到没有的文件则向下递归查找并执行,最后回归执行主命令。
编写好Makefile文件后,之接在当前文件下 $ make 即可自动完成编译。
指定文件名称输出$ gcc max.o min.o hello.c -o hello.out
linux中的shell指令: && (类似于管道‘|’指令),传输连接执行, 并且&&前面执行返回值为0时后面的命令才执行,每一条命令都相当于执行一个可执行文件,而可执行文件又是c语言编译过来的。
$ echo $? 查看上条指令是否执行成功,如果返回值是0则代表成功,否则为不成功。
![](https://i-blog.csdnimg.cn/blog_migrate/16b43257d9a373db1ef6da7000f78cb5.png)
将默认的return 0; 改为别的,也能执行但是返回值就变成修改的那个了,这样不符合系统有些命令的规则,就会出现上面的情况。
标准输入流,输出流,错误流的效果实现:
![](https://i-blog.csdnimg.cn/blog_migrate/18a274a08c5d86fcfc0fe5bbf65a144b.png)
printf/scanf是由fprintf/fscanf后期封装形成的,也就是默认的执行输出/输入/错误流都被封装好了(默认的都是变准流:比如键盘屏幕等)。
运行效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2b463db0696ff845e2b8dfc579c7d324.png)
如果输入小于0的参数就触发了错误流分支,返回自定义的错误信息。linux也就是由若干个小工具组成的。
关于linux的重定向:
![](https://i-blog.csdnimg.cn/blog_migrate/a021de7a4fb78b7f429c71cb7a31af31.png)
标准输出流重定向(>>追加模式, >表示覆盖重写 , 红框中的1可以省略,默认自带。 ):
![](https://i-blog.csdnimg.cn/blog_migrate/076d503f01f713a171ccf532c0cdd21b.png)
标准输入流重定向(反向重定向,将即将输入的数据/参数提前写到一个文档中然后敲命令):
![](https://i-blog.csdnimg.cn/blog_migrate/115e3b155707bc0cc406f763f88ed6dd.png)
标准错误流:
先修改main.c文件:
![](https://i-blog.csdnimg.cn/blog_migrate/0f511209a7b5e856f909fd46fed772d4.png)
然后编译$ cc main.c
运行$ ./main.out
如果将j输入值为0即出发标准错误流机制。
![](https://i-blog.csdnimg.cn/blog_migrate/7f21761b493868ff523786509a69bca4.png)
上图中画红线的命令意思: 执行a.out文件,将标准输出流重定向到t.txt文件,将标准错误流重定向到f.txt文件中(2代表标准错误流)。
![](https://i-blog.csdnimg.cn/blog_migrate/5eb51f5f368b4af4f58abe6ce55102a1.png)
当前没有建立input.txt文件,所以执行后会向错误流文件(f.txt)中打印错误信息。
关于管道( | )的原理以及应用:
linux管道可以将linux shell中多个小工具集合起来一起使用。
有了管道linux才可以变得无比强大,没有管道多个程序很难结合在一起工作形成一个大项目。
为了理解管道的作用,写个小实例,内容如下图,然后分别编译:
![](https://i-blog.csdnimg.cn/blog_migrate/5af261669e65e04d460995f4be72db48.png)
将编译后的可执行文件(小工具)通过管道串行执行,input的输出流正好是avg的输入流,然后得出最终结果。
![](https://i-blog.csdnimg.cn/blog_migrate/ba84b7fe9fbaa4af9995ac291f309a1c.png)
到此,入门C基本知识点将告一段落。
接下来将讲到C语言的核心知识(灵魂):
指针和内存
未完待续 ... ...