1.1.2--解析第一个代码 hello world
C代码编译成可执行程序经过4步:(如图)
1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。2)编译:检查语法,将预处理后文件编译生成汇编文件
3)汇编:将汇编文件生成目标文件(二进制文件)
4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
多过程编译,可以合并为下面2个
预处理:gcc -E hello.c -o hello.i
编 译:gcc -S hello.i -o hello.s
汇 编:gcc -c hello.s -o hello.o
链 接:gcc hello.o -o hello_elf
Windows下编译:
gcc -o NAME.exe NAME.c
linux 下编译:
gcc -o NAME NAME.c
#include <stdio.h> //开头的第一行表示包含, <>表示系统的头文件 “ ” 通常用户定义的头文件;头文件就是一种库(现在不必在意原理),定义了某些函数的执行代码,有点类似Linux中的共享库,附图1
int main(void) //int代表整型, main 表示函数开始(只能有一个) ( )括号里面的有点类似于 Linux命令中的 传递给函数的参数,比如 chmod 777 /etc/ 后面面的 777 和 /etc/
{
printf("hello world\n"); //语句,例如printf 就是在stdio中定义 “ 这里是常量” \n: 这个是转义字符
return 0; //返回值 必须要与 int 对应 , 可以理解为 返回已经被main之前 定义或没有定义格式 的结果,但是必须对应定义格式 && 而且执行到此处的时候下方不会执行了,就会退出
}
附加:
int main(int nums, char *nums[]) // chmod 777 a.txt b.txt c.txt int nums 就是存储统计命令个数 5 (假设空格键为分隔符) , char *nums 就是存储这句命令
图一:
在这个图之中,可以看到一个程序地不同数据的使用是相互的,但是在操作系统之中,每一个程序都是认为这个系统上只有自己,也就是内核部分给他们了一个假象,但是在实际应用中,内存是共享的,但是这样做的好处就是程序之间实现了隔离,安全,避免了各个进程之间的干扰,但是一旦涉及到其他程序之间的访问时,就要通过请求内核权限来进行,这里就不过多的说明,有时间我会去写一下内核的作用及如何管理
