基础: //这里是注释,会在编译时去掉 /* 这里是多行注释,可以换行注释*/   

C代码编译成可执行程序经过4步:(如图)

1)预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2)编译:检查语法,将预处理后文件编译生成汇编文件

3)汇编:将汇编文件生成目标文件(二进制文件)

4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

1.1.2--解析第一个代码 hello world 随笔 第1张

多过程编译,可以合并为下面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 就是存储这句命令

图一:

  1.1.2--解析第一个代码 hello world 随笔 第2张

   在这个图之中,可以看到一个程序地不同数据的使用是相互的,但是在操作系统之中,每一个程序都是认为这个系统上只有自己,也就是内核部分给他们了一个假象,但是在实际应用中,内存是共享的,但是这样做的好处就是程序之间实现了隔离,安全,避免了各个进程之间的干扰,但是一旦涉及到其他程序之间的访问时,就要通过请求内核权限来进行,这里就不过多的说明,有时间我会去写一下内核的作用及如何管理

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄