您的位置:首页 > 编程语言 > C语言/C++

C语言程序如何从代码变成可执行程序?(预处理总结)

2016-10-18 14:23 211 查看
想要知道这个问题,首先要了解:

编程语言包括,机器语言,汇编语言,高级语言。

计算机使用的是0,1这样的二进制,二进制是计算机的基础,用这些0,1组合来命令计算机去工作。学校里那些老教授讲起他们求学的时候,总喜欢说我们那时候编程序用的是打孔的方式,也就是写出一串串0,1的组合来编程序。为了缓解编程的痛苦,一个新的语言出现了——汇编语言。用一些简洁的英文字母、符号串来替代一个特定的指令的二进制串,比如,用“A D D”代表加法,“M
O V”代表数据传递等等,但是计算机并不认识这些,所以就需要一个翻译程序来完成这项工作,这种翻译程序就叫做汇编程序。 但是汇编程序还是很复杂,高级语言的出现使程序更容易编程,更人性化。

但是一个C语言程序如何从代码变成可执行程序?可以简单概括为:C源程序->编译预处理->编译汇编程序->链接程序->可执行文件

一、预处理

预处理阶段阶段包括头文件展开,宏替换,去注释,条件编译。

头文件展开:头文件一般形式为#include<stdio.h>或者#include “game.h" 。两者的区别为后者一遍在寻找头文件时是在当前工程目录下寻找,前者实在系统库的目录下寻找。但是,头文件是干什么的呢??头文件一遍用#include定义了宏,或者一些函数的声明。使用头文件的目的就是为了多个C语言文件调用某个定义,只需引用头文件就不在需要在定义一遍。预处理阶段的头文件展开就是把头文件那些所需要的定义加入到程序中以供使用。

宏替换:#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为。(常见约定:宏的名字全部大写)

在预处理阶段,编译器把参数替换到文本中,进行运算。

宏不单单可以替换变量常量,也可以替换函数。但是宏和函数还是有些区别;

参数类型:宏与类型无关。例如:比较两个数的大小可以用宏来完成,#define MAX(a,b) ((a)>(b)?(a):(b)) 使用宏的好处是不用考虑啊,a,b的类型,可以是整型,可以浮点型,但是用函数来完成就比较麻烦。

代码长度:每次使用宏都要将代码插到程序中,除非代码很小否则代码程度大大加长,这时使用函数就比较好。

执行速度:使用宏更快,使用函数存在调用/返回函数的额外开销。

参数求职:参数每次使用宏定义时,他们都将重新求值可能产生不可预料的结果。函数不会有影响。

操作符优先级:宏参数求值是在所有周围表达式的上下文环境里,除非加上括号,否则可能产生不可预料的结果。而函数参数只在调用时求值一次并反給函数,表达式的求值结果更容易预测。

去注释:预处理阶段,编译器把那些注释的语句自动删除。

条件编译:可以选择代码的一部分是被忽略还是被执行。

语法:

#if
constant-expression  (常量表达式)

statements1

#elif constant-expression

statements2

#else 

statements3

endif

是否被定义:测试一个符号是否被定义

#if defined(symbol)

#ifdef symbol

#if  !defined(symbol)

#ifndef symbol





编译:把C语言代码转化成汇编代码

链接程序:把多个文件链接一起生成可执行程序。


$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息