1、文件包含
在以前的学习中我们可以知道,程序在运行的时候先编译,再链接,最后执行。所谓的编译预处理就是在编译之前处理的工作。
编译处理不是C语言的语法范畴,所以每条的编译处理命令都要单独占一行,均以“#”开头。
#include<stdio.h>//1
#include"stdio.h"//2
在这里简单说明一下上面两个文件包含命令的区别:
1:是直接到指定的标准包含文件目录(用户在设置环境就提前设置好的)
2:表示先到当前的源文件去寻找,如果找不到就到标准文件目录去寻找。
我们可以发现使用(“”)的寻找范围跟大一些,但是使用<>的寻找速度会快一些,效率会更高一些。
2、宏定义
宏定义命令可分为两种形式:一种是带有参数的宏定义,简称带参宏,还有一种就是不带参数的宏定义,简称无参宏。
在程序中,凡是遇到符号常量名的地方,经过编译处理之后,都被替换为与其对应的字符串。宏名的有效范围为从定义命令开始到本源文件的结束,但是我们可以使用#undef命令来终止宏定义的作用域。
接下来我们看一下,无参宏的使用举例:
#define pi 3.14
#include<stdio.h>
void fun1()
{
double s,d,r;
r=5.0;
s=pi*r*r;
printf("面积是:%f\n",s);
d=2*pi*r;
printf("周长是:%f\n",d);
}
#undef pi//结束了pi的有效范围
void main()
{
fun1()//调用了fun1函数,无返回值所以可以不用写函数类型
prinf("pi的值:%f\n",pi);
}
分析:当我们运行这段程序时,我们会发现最后一句 printf("pi的值:%f",pi);报错,这是因为#undef的命令让pi的作用域结束在那一行代码。
3.预处理
预处理程序对符号常量的处理只是简单的替换的工作,不进行语法检查,如果程序中使用的预处理的语句有错误,那只能在编译阶段才能检查出来。
4、带参宏的使用:
#define 宏名(参数表) 字符串
宏名和参数表之间不能有空格,并且在字符串中要与与参数表中指定的参数,在替换时不仅要对宏名进行替换,还要对参数进行替换。
不过用于替换的参数实数可以是常量,已经被赋值的变量或者表达式。下面举例说明:
#include<stdio.h>
#include M(x) x*10//带参宏定义
void main()
{
int s;
s=M(5);//用常量来替换参数
printf("s=%d",s);
}
s=50
代码的运行结果如上:
接下来我们看一下,带参宏替换时用表达式替换参数实例:
#include<stdio.h>
#define M(x) x*10
void main()
{
int s,a;
printf("input a:\n");
scanf("%d",&a);
s=M(a+1);
printf("s=%d",s);
}
代码的运行结果是:
intput a
a=4
a=14