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();
编程语言包括,机器语言,汇编语言,高级语言。
计算机使用的是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();
相关文章推荐
- 如何在OD加载程序遇到入口点之前执行代码之二:静态装载DLL
- C的代码是如何变成程序的
- 什么是BSS段和c语言程序如何变成可执行的文件
- Java控制台程序如何在用户关闭时执行清理代码
- Linux内核设计第七周学习总结 Linux内核如何装载和启动一个可执行程序
- 如何在服务器上面执行定时程序,在指定的时候执行指定的代码
- 如何在OD加载程序遇到入口点之前执行代码之一:线程局部存储
- 代码变成可执行程序期间,编译器做了那些事?
- Applet程序浅析(如何嵌入HTML代码中执行)
- C语言源程序(.c)如何变成可执行程序(.exe)
- 如何在程序异常或正常退出JVM时执行特定代码
- 代码变成可执行程序期间,编译器做了那些事?
- 程序中如何使用代码执行Insert操作
- 代码变成可执行程序期间,编译器做了那些事?
- 【PE】如何将Python程序变成可执行程序?
- Android如何使代码等待一段时间再执行?直接贴程序麻烦高人来看一下。
- 谈谈c语言程序如何变成可执行文件
- 计算机是如何执行程序的(以汇编一个简单的C程序,分析汇编代码为例)
- 如何在程序异常或正常退出JVM时执行特定代码
- 如何在程序中执行动态生成的Delphi代码