程序的环境和预处理

上一篇博客已经了解过文件的操作,这篇主要解决一个问题:我们在用C语言写代码的时候,建立的是后缀为.c的源文件,而windows环境下可执行程序的后缀是.exe,从代码到可执行程序,这中间经过了哪些步骤

目录

1.程序的环境

1.1翻译环境

1.1.1预处理

1.1.2编译

1.1.3汇编

1.1.4链接

1.2执行环境

2.预处理详解

2.1预定义符号

2.2#define

2.3条件编译

2.4#include<>和#include""的区别


1.程序的环境

在ANSI C的任何一种实现中,存在着两个不同的环境:翻译环境和执行环境

翻译环境用于将我们所写的源代码转换为可执行的机器指令

执行环境用于执行代码

1.1翻译环境

关于翻译环境,中间的过程、原理等过于复杂,这里只说重点

翻译环境包括编译和链接两个部分,其中编译又可以细分为预处理、编译和汇编三个部分

1.1.1预处理

在预处理中主要进行了三个操作:

1.包含程序中声明的头文件

2.删除程序中的注释

3.若使用了#define定义宏或标识符,在此阶段会进行替换

1.1.2编译

将C语言代码转换成汇编代码,包括:

1.词法分析

2.语法分析

3.语义分析

4.符号汇总

1.1.3汇编

将汇编代码转换成二进制指令

经过上述过程后,会生成目标文件(windows环境下后缀为.obj)

1.1.4链接

将目标文件进行链接,生成可执行程序

1.2执行环境

执行环境中的过程如下:

1.将程序载入内存中,在有操作系统的环境中这个操作会由操作系统完成,没有操作系统的环境则需要手动来完成

2.调用main函数

3.开始执行代码,此时程序会使用一个运行时堆栈,代码如何执行的在之前的博客中有介绍:图解函数栈帧的创建和销毁全过程_鹰不泊wyk的博客-CSDN博客

4.终止程序

到这开头提出的问题基本就解决了,这里展开来讲一下预处理

2.预处理详解

2.1预定义符号

C语言内置了一些预定义符号,我们在写代码的时候可以直接使用:

__FILE__:进行编译的源文件的文件名

__LINE__:当前的行号

__DATE__:文件被编译时的日期

__TIME__:文件被编译的时间

__STDC__:如果编译器遵循ANSI C,值为1,否则就是未定义

如图:

 

这些预定义符号一般会在日志中进行使用

2.2#define

#define这个预处理命令之前多次使用过,这里就具体介绍下其功能

  • 定义标识符

类似下面这种:

#define MAX 100

需要注意的是,在末尾处是没有分号的

  • 定义宏

例:

#define SQU(x) x*x    //同样末尾没有分号

注:因为#define是在预处理的时候将符号进行替换,所以在main函数中参数是什么样,那么替换过去就是什么样

 

同样的,如果参数带有++/--操作符,则会进行两次计算

宏的使用和函数类似,二者之间的区别如下:

1.对于一些简单运算,宏的效率要高于函数,但复杂运算宏无法胜任

2.宏的参数的数据类型不需要声明

3.宏不能调试和递归 

另:为了和函数进行区分,故约定在使用#define定义标识符和宏的时候,名称全部使用大写

2.3条件编译

即可以选择让某段代码,在什么情况下被编译,一般库函数使用的较多,因为库函数要兼顾多个平台,所以即使是相同的功能,不同平台之间的代码也可能会有差异

常见的条件编译指令如下:

  • #if......#endif

使用和if语句类似,当#if后面的条件为真,中间的代码才会被编译

  • #if......#elif......#else......#endif

多分支的条件编译,使用也和多分支的语句类似

  • 判断某个符号是否被定义

#if defined()

#ifdef

二者作用相同,若符号被定义,则程序被编译

 

#if !defined()

#ifndef

若符号没有被定义,则程序被编译

2.4#include<>和#include""的区别

  • #include""

程序会先在源文件所处目录下进行查找,若未找到头文件,则去标准位置进行查找,还未找到的话就提示编译错误

  • #include<>

直接去标准位置查找头文件,未找到提示编译错误

从功能上看,#include""完全可以替代#include<>,但实际上#include""的效率要低,所以一般库函数还是会使用#include<>

关于程序的环境和预处理的内容就到这,整个C语言的内容也基本上完结了o(* ̄▽ ̄*)o,进阶内容会在以后的时间中不断的进行更新

 

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星鸦wyk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值