00:01
继续学习C语言课程的下一个章节,预处理命令和宏定义。首先呢,我们来先看一下什么叫预处理命令,看一下。什么叫预处理命令呢?我们先做一个基本的介绍。预处理命令我们在前面其实已经使用过了,比如说我们在使用库函数之前,是不是我们用这一个井号include引入了对应的头文件,那么在C语言里边与这个井号开头的命令呢?我们都称之为预处理命令。那么预处理面令它到底怎么体现它的预处理呢?注意听这句话。有这些在编译之前对原文件进行简单的加工的过程,我们就称之为预处理。即预先处理、提前处理的意思。那么这个预处理它是怎么发生呢?大家看,预处理主要是以井号开头的命令,比如说include。
01:03
当然还有其他的一井号开头的,后面我们还会说哈。预处理命令要放在所有的函数之前,而且一般是放在原文件的前面。预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对原文件中的预处理部分进行处理。那这句话我要勾出来。哪句话呢?就是这句话我们要标出,换言之就是说我们预处理程序是在编译之前操作的,那我可以画一个简单的示意图,我们原先是不是这是我们的原文件。源文件呢?是经过一个编译。对吧,编译过后我们生成了一个目标文件,Obj文件是编译。是不是这是我们的编译,但是呢,这个预处理它是什么时候发生的呢?它实际上是在编译之前进行的,也就是说原文件先经过我们的一个预处理,然后再交给我们编译。
02:14
所以说这个之前呢,有一个所谓的预处理的一个过程,这是一个预。这个文件拿到以后交给他,明白了哈,这个过程也也就是说你要记住预处理它是在编译之前发生的就可以了。接着我们继续看处理完毕以后,处理完毕以后自动进入对原程序的编译,就是刚才我说的那个流程。那么C语言它提供了多种预处理功能,比如说宏定义,换言之,就是说宏定义呢,其实也是属于预处理命令的一种,再比如说文件包含条件编译等等。合理的使用。他们可以让我们的代码便于阅读、修改、移植和调试。换言之,我们使用预处理命令的作用或者目的是干什么呢?让我们程序具有更好的阅读性、修改性、一致性和调试。利于我们模块化的。
03:16
编程,那同学们看到我们做了这么多介绍,基本介绍过后呢,肯定同学们对这个并不是很了解,也不知道老师在说什么,这样子我们还是来一个快速入门案例,我们写一个程序来帮助同学们理解什么是预处理。来看这么一个具体的需求,快速入门。开发一个C程序。让它暂停五秒以后再输出hello上硅谷这句话,并且要求实现跨平台,也就是说在Windows下和Linux下我们都能运行。请问如何写?那这里呢,我这里有个这有个提示吧,我们叫提示。
04:00
提示,这里面最大的问题,它是需要做到一个跨平台的处理。换言之,就是说我们的代码呢,既可以在Windows上面运行,也可以在link上面运行,我们要实现这么一个功能。对,那这里呢,有一个问题就是。呃,怎么让一个程序停留五秒呢?注意,这里面其实是靠一个函数来实现的,大家看这里Windows平台下的暂停函数的原型是sleep,大写的S。单位是毫秒。它是在Windows h这个头文件中。而Linux平台下暂停函数呢,它就变了,它是小写的sleep。对,那么它的这一个单位呢,是毫是秒,你看这个是不一样的,一个是毫秒,一个是秒,而且函数呢,它也不一样。而且在Linux下面呢,暂停函数是在这个头文件里面,那就麻烦了。
05:02
怎么办呢?好,同学们,现在我们就可以用语处理命令来完美的解决跨平台的问题。怎么解决大家看,我跟大家看一下这个代码的一个演示哈,因为代码本身并不难,主要是把这个预处理的使用给大家讲清楚就可以了,来我们呢。加成一个,因为这是一个新的章节,因此我再建一个文件夹。对,我们再建一个文件夹,取个名字叫chapter。CHAPTER10。第十个,那现在呢,我们看一下预处理的这么一个案例。好,我们就叫取个名叫pray。提前的,提前的一个处理process。好,Process,然后DEMO我们写个零一吧,因为将来可能还会有别的案例。写到这里来。小代理来过后呢,我们把这个代码给大家拿过来,我们体验一下。
06:03
这段代码呢,同学们刚看可能是看不懂的,我解释一下。先看这句话。先看这句话,这句话就是一个预处理的命令,什么意思呢?就说如果现在是Windows操作系统,这句话的意思是。如果是Windows平台。平台这里面他用的是一个下划线WIN32来判断的,这个WIN32,这个是事先我们系统已经定义好的,就是表示它是一个Windows平台,如果是Windows平台呢,我们就执行下面的这句话。对,就执行这句话。明白这个意思了吧?执行这句话,那换言之就是说如果是Windows平台,我就引入windows.h,下面看这个是L1的意思,否则或者叫做。否则否则什么呢?否则就是再判断一下是不是Linux平台。
07:04
否则,判断。是不是Windows平台,这这是也是定好的,如果你是Windows平台下呢,它会定义一个这样的一个量,一个常量叫。Linux。否则判断是不是Linux操作系统。对。如果是Linux操作系统。哎,如果是link操作系统就引入。就引入。所以说你看这个肯定是发生在编译之前的,对不对,他在编译之前就要执行这些预处理命令,否则就引入这个头文件。看到没有,这这个语句。就是做这个事情的,你看这里是不是如果怎么怎么样,否则怎么怎么样,N if这个表示结束。这个就表示结束,这也是个预处理指令,那下面呢,同学们可以看到这里,他说不同的平台下调用不同函数,你看这里面写了,如果是WIN32叫Windows平台识别,Windows平台我们调的是大写的sleep,而且呢是毫秒计算的。
08:12
就是毫秒。毫秒。好。毫秒。啊,下面呢,如果是Linux这个平台,我们是按调这个sleep来实现的,看到没有这sleep这是按秒来计算的。没问题吧,同学们,下面这两个呢,一个put,一个get,这个呢也是输出啊,这个也是输出,就是同学们看到这个函数呢,可能现在还不太熟悉,我引下头文件就可以了。遭引入。Include ST dl。好,这就OK。那么这个OK了以后我们看这个include加进去这事,这也是输出一句话啊,Put也表示输出跟我们沿着这个print f那个效果是一样的,输出一句话。
09:03
输出。好,各位同学,大家看这段代码就是考虑到了什么呢?考虑到在不同的情况下,我引入不同的头文件,以及在不同的平台下,我调用不同的这个函数。这就是预处理的一个经典的使用场景,什么意思呢?就是在编译之前,我就要来进行不同的处理。好,那么我们来运行一下,看看这个代码能否运行成功。好,我把。我把前面讲的这些先给他注销一下。我们看诶对,这边这个是预处理好,我们看看代码生成是否没有问题。因为上午呢,我们讲的时候可能会有一些没注销。好,已经成功了,成功过后同学们,我们现在就来运行一下哈,我们来运行一下,看看此时此刻能否输出正确的结果。
10:04
好一秒两秒三秒四秒五秒出来了,应该。Hello,上面正确,也就是说现在在Windows平台上我们是可以正正常运行的,那我要问同学们一个问题。那我要问同学们一个问题,这个在Windows平台和在Linux这个平台下面,我们生成的源代码其实是不一样的,知道吗?呃,这点大家一定要注意啊,我多说一句。这里呢,我多说一句哈,说明。说明在Windows。在Windows操作系统。操作系统和Linux操作,诶操作系统下生成的源代码。对,生成的源码不一样。不一样。这点大家要清晰的知道,也就是说如果是window操作系统呢,这这一句话,这window操作系统它用的是这个,这句话就被抛掉了。
11:06
就在源码里面,其实看不到的,那源码生成是什么呢?我可以告诉大家,它生成是这样子的,如果是在Windows下面呢,它最终生成的源代码其实就这样子的。各位,它其实生成的就这样子的。诶大家理解一下,就这里面这些都都会没有了。这都没有了。对,他在Windows下面呢,它最终生成的源代码其实就是这一部分。如果在Linux下面呢,它生成的源代码就是这个,再加上下面小写的sleep,我就不去写它了,这点一定要注意,就在不同的平台下面呢,它生成的源码不一样,因为它会在预处理之前就把不需要的部分给你拿掉。然后再进行编译。好的,同学们,那关于我们预处理命令的一个基本介绍和快速入门就给大家讲解到这里。
我来说两句