c语言入门-01

当我们学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这个函数并不是我们自己写的而是库文件里面的内容

连接的作用就是让库文件跟我们写的代码产生联系,然后我们代码中能代用库中方法

 

posted @ 2017-09-15 14:52  nerdlerss  阅读(221)  评论(0编辑  收藏  举报