首先是预处理方面的知识:
在将一个程序编译过程中会执行如图过程:
然后再链接过程中,将各个原文件链接起来形成可执行程序, 像#include,#define,#pragma这些命令都是在预处理过程中执行的,#include是导入头文件,相当于把头文件中的内容复制粘贴到程序中,#define可以定义一些常量,也可以定义宏(可以起到类似函数的作用)
那么在预处理过程中,会把#define定义的东西在处理过后都会把程序中的相应内容给替换掉,包括注释的删除,以及其他预处理指令会在这个过程执行。例如#if,#undef,#ifndef,#endif等等。这些预处理指令在vs上难以实现,有兴趣了解的可以看一下这个链接。(5条消息) C语言进阶-程序环境与预处理_爱敲爱骑的博客-CSDN博客
下面是宏的介绍,我们知道#define 在定义常量之后,在代码中使用对应的符号就是对应的数字,其实#define的作用就是替换相应的内容,那么我们可以实现以下两个数的相加用#define实现代码如下:
上面说过,宏定义其实就是把对应的参数进行一个替换,这个替换是在预处理阶段就已经进行了,那这个代码的意思就是
就是做了个替换,那我们接下来有一个代码要读者猜一下程序输出什么,
如果对宏定义不熟悉的那么可能就做错了,这道题的结果是
有人就会想,为什么不是 21呢,其实这正是宏的本质特点,他只会进行替换,而不进行其他操作,那么相当于是这么一个样子
这也算是宏的一个特点,他不会像函数一样将参数处理好之后再将参数传过去,而宏只是进行替换,那么我们在使用宏的过程中就需要将宏中定义的参数都加上括号然后再将整体加上括号,这样极大可能会达到我们预想的结果,就像这样:
还有是宏里面还有一个知识点是‘#’和‘##’的认识
首先是‘#’,在宏里面,它的作用是将参数名转为字符串,举个例子,
那根据这个特性我们可以做这么一个东西,那就是假如num是浮点型呢,或者其他类型呢,我们直到,对于函数他的接收参数类型是确定的,但是对于宏来说,它参数不受类型限制,那要实现一个打印上面那么一句话对于任意类型的变量,函数是做不到的,我们就可以用宏来实现它,代码如下:
还有一个是‘##’,这个很简单,它会将两个参数名给结合到一起,但结合好的必须是已经声明或定义的,代码如下:
这就是我对程序预处理,以及#define的认识,要是有不对的地方,请指正。