zoukankan      html  css  js  c++  java
  • 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这个函数并不是我们自己写的而是库文件里面的内容

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

  • 相关阅读:
    Vue官方脚手架分环境打包配置及接口环境切换
    JS超全判断终端
    H5与APP(安卓及IOS)交互方法
    json数据扁平化处理(适用于接口传参复杂数据加密处理)
    VUE实践经典记录(持续更新)
    Javascript 词法分析
    三栏自适应布局
    前端神器 Firebug 2.0 新特性一览
    事件绑定(终极版)
    正则表达式(下)
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/7526444.html
Copyright © 2011-2022 走看看