当我们学c语言我们学些什么.
[1]编译机制
当我们写好c的代码,生产了程序,这中间到底做了些什么?
这个就是c语言的编译过程 我们分别来解析这上面的过程。
我们写出我们第一个c程序。
1 #include<stdio.h> 2 3 int main(){ 4 // print hello world 5 printf("hello world"); 6 7 } ~
1>预编译
我们可以通过 gcc -E 来生产预处理文件
(1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换
(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些
(3)处理#include,将#include指向的文件插入到该行处
(4)删除所有注释
(5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行
(6)保留#pragma编译器指令,因为编译器需要使用它们。
2>编译
通俗点说就是吧人类能读懂的c语言翻译成机器能听懂的语言
通过 -S 参数可以吧代码编译成汇编代码
1 .file "hello.c" 2 .section .rodata 3 .LC0: 4 .string "hello world" 5 .text 6 .globl main 7 .type main, @function 8 main: 9 .LFB0: 10 .cfi_startproc 11 pushq %rbp 12 .cfi_def_cfa_offset 16 13 .cfi_offset 6, -16 14 movq %rsp, %rbp 15 .cfi_def_cfa_register 6 16 leaq .LC0(%rip), %rdi 17 movl $0, %eax 18 call printf@PLT 19 movl $0, %eax 20 popq %rbp 21 .cfi_def_cfa 7, 8 22 ret 23 .cfi_endproc 24 .LFE0: 25 .size main, .-main 26 .ident "GCC: (Ubuntu 6.3.0-12ubuntu2) 6.3.0 20170406" 27 .section .note.GNU-stack,"",@progbits
通过-c 可以生成二进制文件 .o 这里的的就是机器码了
3>连接
说白了 我们的prinf这个函数并不是我们自己写的而是库文件里面的内容
连接的作用就是让库文件跟我们写的代码产生联系,然后我们代码中能代用库中方法