zoukankan      html  css  js  c++  java
  • c编译过程

    c的编译过程是一个很简单的问题,但是就是有很多我会经常忘记,包括我自己,所以既然这个东东非常重要又很容易忘记,所以多看几次就好了嘛,所以今天在这里总结一下。

    参考网站:http://www.cnblogs.com/wuyouxiaocai/p/5701088.html

    预处理

    (1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

    (2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

    (3)处理#include,将#include指向的文件插入到该行处

    (4)删除所有注释

    (5)添加行号和文件标示,这样的在调试和编译出错的时候才知道是是哪个文件的哪一行

    (6)保留#pragma编译器指令,因为编译器需要使用它们。

    那么,什么时候需要预处理呢?

    1、总是使用不经常改动的大型代码体。
    2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

    编译

    (1)词法分析,

    (2)语法分析

    (3)语义分析

    (4)优化后生成相应的汇编代码

    从 高级语言->汇编语言->机器语言(二进制)

    链接

    就像刚才的hello.c它使用到了C标准库的东西“printf”,但是编译过程只是把源文件翻译成二进制而已,这个二进制还不能直接执行,这个时候就需要做一个动作,

    将翻译成的二进制与需要用到库绑定在一块。打个比方编译的过程就向你对你老婆说,我要吃雪糕。你只是给你老婆发出了你要吃雪糕的诉求而已,但是雪糕还没有到。

    绑定就是说你要吃的雪糕你的老婆已经给你买了,你可以happy。

  • 相关阅读:
    《试题库管理系统的设计与实现》11
    转 windows10安装docker
    转 linux 安装docker
    Centos7 离线安装RabbitMQ,并配置集群
    Linux配置Redis主从
    CENTOS7下安装REDIS
    sql删除相同数据(无主键)
    mybatis中 <if test=>等于的条件怎么写
    java 日期获取,每月一号,每周一
    Oracle中merge into的使用
  • 原文地址:https://www.cnblogs.com/wenzong/p/7608940.html
Copyright © 2011-2022 走看看