C语言自学笔记---C语言预处理库和C库

非教程

  • 明显常量:#define
    • 1,#define 用法示例:
    • 2,宏展开发生是在编译器预处理过程中而不是程序运行过程中
    • 3,重定义常量
    • 4,在#define中使用参数(类函数宏)

明显常量:#define

1,#define 用法示例:

#define    PI     3.1415//程序中所有出现PI的地方都特指3.1415
指令       宏       主体

提示:宏可以替代 常量 字符串 甚至是一个C表达式;并不是所有编译器都支持宏嵌套i,及宏定义中包含其它宏。

2,宏展开发生是在编译器预处理过程中而不是程序运行过程中

请仔细体会下面的代码:

#define  	 LEN1  20
const int    LEN2=50
static int   dat1[LEN1];//合法定义
static int   dat2[LEN2];//无效定义
const int    LEN3=2*LEN1;//合法定义
const int    LEN4=2*LEN2;//无效定义

3,重定义常量

两次或多次对一个宏定义常量,ANSI标准只允许每次定义的宏常量相同否则报错。请看代码:

#define	a	1
#define a	1
//合法操作
#define	b	1
#define	b	2
//两次宏定义结果不同 无效操作(有的编译器是警告有的是错误)

4,在#define中使用参数(类函数宏)

通过使用参数可以进行类函数宏的创建(function-like marco)。请看代码:

#define	sub(a,b)	a+b

下面通过一个程序分析类函数宏和函数的区别(程序修改自C Primer Plus):

#define SQARE(X) X*X
#define RP(X)	printf("the result is %d.\n",X)

int main(void)
{
	int X=4;
	int z;
	printf("X=%d\n",X);
	z=SQARE(X);
	printf("X:");
	RP(X);
	printf("X+2:");
	RP(X+2);
	printf("100/X:");
	RP(100/X);
	return 0;
} 

C语言自学笔记---C语言预处理库和C库_第1张图片
由运行结果看明显和想要得到的结果不一致。
原因分析:函数调用是把参数传给函数,而宏是在编译过程中将所有与宏相同的标识均替换成主体。请看下面示例说明:

#define	F(X)	X*X
#define    F1(Y)	((Y)*(Y))
int X=Y=3;
F(X+2);//相当于3*3+2而不是(3+2)*(3+2)
F1(Y+2);//即(3+2)*(3+2) 请仔细体会其中区别

//未完待续。。。2019年3月15日 01:57:06

你可能感兴趣的:(C语言自学笔记)