原标题:C语言之预处理命令
在C语言中,说明语句和可执行语句由来完成程序的功能,除此之外,还有一些预编译处理命令,所有的预编译处理都以#号开头,占用源程序中的一行,一般是放在源程序中的首部。
注意:编译预处理不是C语句,行末不用加分号。
C语言的预处理指令主要有三种:宏定义、文件包括(就是头文件的 类型)、条件编译。
我们先来看看宏定义:
宏定义有两种方式:一种是带参数的宏另一种是不带参数的宏。
不带参数的宏定义形式:
# define 宏名 字符串
例如:# define PI 3.1415926
1) define是关键字,表示宏定义;
2) 宏名必须符合标识符的定义,为区别变量,宏名一般采用大写字母。
3) 宏的作用:在程序的任何地方都可以直接使用宏名,编译器会先将程序中的宏名用字符串替换,然后在进行编译。这称为是宏替换,宏替换并不进行语法检查。
4) 宏名的有效范围是从定义命令之后,直到源程序文件结束,或者遇到宏定义终止命令#undef为止。
我们来看一个例子:
输入半径,求圆的面积:
#include
#define PI 3.1415926
int main()
{
double s, r;
printf("请输入圆的半径r:\n");
scanf_s("%lf", &r);
while (r > 0)
{
s = r * r * PI;
printf("圆的面积s为:%lf\n", s);
printf("请输入圆的半径r:\n");
scanf_s("%lf", &r);
}
return 0;
}
带参数的宏:
带参数的宏的定义形式是:
# define 宏名(参数表) 字符串
需要注意的是:字符串中一定要包含有参数表中的参数,只有这样两者才能被联系起来;
在宏替换时,是将字符串中的参数用参数表中的参数进行替换。
假如定义了这样的宏:
# define S(r) 3.1515926*r*r
在程序中若出现S(3.0),则相当于3.1415926*3.0*3.0.必须注意,这种替换是严格意义上的字符替换。
若在程序中出现S(3.0+4.0),则相当于3.1415926*3.0+4.0*3.0+4.0。
也许这样的结果并不是你想要的,因此在设计有参数的宏的时候,有可能会出现二义性,这是应该注意避免的。
例如:
#include
#define F(a) a*b
int main()
{
int x, y, b, z;
printf("请输入x和y的值:\n");
scanf_s("%d%d", &x, &y);
b = x + y;
z = F(x + y);
printf("b=%d\nF(x+y)=%d\n", b, z);
}
我们输入3和4
输出结果为:b=7
F(x+y)=31
也许这个结果不是你想要的,实际上在编译的时候z=(x+y)被编译成了z=x+y*b,其结果自然就是z=31
如果你想结果就是这样,那么这就对了,如果你不想是这样,这是为了避免二义性,要将字符串中的参数用圆括号括起来。
# define F(a)(a)*b。
这里有同学可能注意到了,有参数的宏定义与函数在程序语句的运行上有些相似,但是需要在注意的是,有参函数的宏定义与函数是两个完全不同的概念。
下面我们在来看看文件包含
文件包含就是指一个源文件可以将另一个源文件的全部内容包扩进来。
#include
或
#include”包含文件名”
注意:
1. include是命令关键字,表示文件包含,一个include命令只能包含一个文件。
2. <>表示被包含文件在标准目录(include)中。
3. “”表示被包含文件在指定的目录当中,若只有文件不带路径,则在当前目录中,若找不到,再到标准目录中寻找。
4. 包含文件名可以是.c源文件和.h头文件,如
#include
#include”myhead.h”
#include”D:\\myexam\\myfile.c”
采用文件包含可以将多个源文件拼接在一起。
好了!今天的讲述就到这里了。返回搜狐,查看更多
责任编辑: