C语言—预处理器1:宏(#define)

 C预处理器在源代码编译之前对其进行一些文本性质的操作。它的主要任务包括删除注释、插入被#include指令包含的内容、定义和替换由#define指令定义的符号以及确定代码的部分内容是否应该根据一些条件编译指令进行编译。
C语言提供了以下几种重要的预处理器指令:

指令 描述
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个#if……#else条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中

1.#define
预处理指令#define指令的描述入下:

#define name stuff

有了这条指令后,每当有符号name出现在这条指令后面时,预处理器就会把name替换成stuff.
例如:

#define reg          register	//将register替换为reg
#define do_forever   for(;;)	//使用更具描述性的符号代替一种无限循环
#define CASE         break;case	//自动将beak放在case之前使switch语句看上去更像别的语言

如果定义中的stuff非常长,它可以分成几行,但是除了最后一行之外,每一行的末尾都要加一个 " \ "
例如:

#define  PROCESS_LOOP					\
		for( int i = 0; i < 10; i++ ){	\
			sum += i; 					\
			if (i > 0) 					\
				prod *= i; 				\
}

2.宏
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或宏定义。宏的声明如下:

#define name(parameter-list) stuff

其中,parameter-list(参数列表)是由逗号分隔的符号列表,它可以出现在stuff中。例如:

#define SQUARE(x)   x * x

当把SQUARE(5)表达式置于程序中时,预处理器就会用 5*5来替换该表达式。
如果有一个代码段:

a = 5;
printf("%d\n", SQUARE(a+1));

参数x被替换成a+1,上面的语句实际上变成了:

a = 5;
printf("%d\n",SQUARE( a + 1 * a + 1 ));

代码输出的值并不是 36 而是 11。
如果将宏定义修改成:

#define SQUARE(x)   (x) * (x)

参数x替换成a+1时,上面的语句变成了:

a = 5;
printf("%d\n",(a+1)*(a+1));

这个问题就解决了。
3.宏和函数
例如:

#define MALLOC(n, type)    ((type*)malloc((n) * sizeof(type)))

代码段

pi = MALLOC(25, int);

将被替换为

pi = ((int*)malloc((25) * sizeof(int)));

你可能感兴趣的:(C语言)