二、C语言---编译预处理

 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

这是因为我们输入a=4 ,程序运行是4+1*10=14。显然这遵循运算符优先级导致的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值