昨天结束了C语言的指针,为什么没有继续写博客,因为我感觉自己到后面还是有点晕,理解的不是很清楚,等我再进修一下,再出一篇详细的C语言指针吧!今天来学C语言的预处理。
在前面我们写代码时经常用到以**“#”**开头的代码,以“#”开头的就是预处理命令。如:
#include<stdio.h>
#define PI 3.1415926
在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,因为它们通常被更早的处理,它们就称为预处理部分。
无参宏的定义:
无参宏的宏明后不带参数。
定义的一般形式为:
#define 标识符 字符串
其中,“#”表示这是一条预处理命令。
凡是以“#”开头的均为预处理命令。
define为宏定义命令。“标识符”为所定义的宏名。“标识符”可以是常数、表达式、格式串等。如:
#define PI 3.1415926
这个作用就是指定用PI来代替数3.1415926,下面代码中所有的PI都代表3.1415926
看代码实例:
这样做主要是为了减少我们写代码时的工作量,也会减少出错,毕竟PI比3.1416926更好敲。
注意:
——宏定义不是说明或语句,在行末不必加分号,如果加上分号则连分号一起置换掉。
——宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如果要终止其作用域可以用#undef命令。
——宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。
——宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
——习惯上宏名用大写字母表示,以便与变量区别。但也允许用小写字母。
如实例:
宏定义表示数据类型和用typedef定义数据说明符的区别。
区别:宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,他不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。typedef后面有分号,表示它是一个语句。
仔细想想上面的代码!!
其次,对“输出格式”作宏定义,可以减少书写麻烦。如实例:
带参宏定义(高手阶段)
C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
带参宏调用的一般形式为:宏名(实参表);
在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:k=55+35
对于带参的宏定义有以下注意事项:
1.带参宏定义中,宏名和形参表之间不能有空格出现。如:
2.在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。
3.在带参宏中,只是符号代换,不存在值传递的问题。
4.在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。
5.在宏定义中,字符串内的形参通常要用括号括起来以避免出错。
对比上面两个代码,运行结果是不一样的,不带括号由于运算优先级不同会导致出错。
6.宏定义也可以用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。
文件包含:
1.一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。
2.文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。
3,包含命令中的文件名可以用双引号括起来,也可以使用尖括号括起来。例如:
但是这两种形式也是有区别的:使用尖括号表示在包含文件目录去查找,而不是在源文件目录去查找。