1.宏定义分为两种:简单的宏、带参数的宏
2.简单的宏
简单的宏定义有如下格式:
#define 标识符 替换列表
替换列表:是一系列的C语言记号,包括标识符、关键字、数、字符常量、字符串字面量、运算符和标点符号。当预处理器遇到一个宏定义时,会做一个 “标识符”代表“替换列表”的记录。在文件后面的内容中,不管标识符在任何位置出现,预处理器都会用替换列表代替它。
简单宏定义如:
#define N 100
# define PI 3.1415926
使用宏的优点:
1> 程序会更易读。一个认真选择的名字可以帮助读者理解常量的意义。否则,程序将包含大量的“魔法数”,使读者难以理解。如PI的使用就是如此。
2>程序会更易于修改。我们仅需要改变一个宏定义,就可以改变整个程序中出现的所有该常量的值。“硬编码常量”会更难于修改,特别是程序中含有大量的硬编码常量时,或者是需要时常修改硬编码常量时。这是宏定义就体现出它的优势了,即只修要更改宏定义即可更改全部的硬编码。
3>可以帮助避免前后不一致或键盘输入错误。例如我们在程序中会输入PI(3.13159267)的时候,可能在一个地方输成3.14159367,在另一个地方输成3.14139267.这时宏定义可以很好的解决此问题。
使用宏时注意事项:
不要在宏定义中使用任何额外的符号,否则它们会被作为替换列表的一部分。
一种常见的错误是在宏定义中使用 = :
#define N = 100
int a[N];
预处理后为: int a[= 100];
另一种常见的宏定义错误是使用分号结尾
#define N 100;
int a[N];
预处理后为:int a[100;];
3.带参数的宏
带参数的宏定义有如下格式:
#define 标识符(x1, x2,…, xn)替换列表
其中x1, x2,…, xn参数列表。这些参数可以在替换列表中根据需要出现任意次。
特别注意:在宏的名字和左括号之间必须没有空格。如果有空格,预处理器会认为是在定义一个简单的宏。例如:
假定我们定义了如下的宏:
#define MAX(x,y) ((x)>(y) ? (x) :(y))
现在如果后面的程序中有如下语句:
i = MAX(j+k, m-n);
预处理器会将这些行替换为:
i = ((j+k)>(m-n)?(j+k):(m-n));
优点:
1>程序可能会稍微快些。一个函数调用在执行时通常会有些额外开销——存储上下文信息、复制参数的值等。而一个宏的调用则没有这些运行开销。
2>宏会更“通用”。与函数的参数不同,宏的参数没有类型。因此,只要预处理后的程序依然是合法的,宏可以接受任何类型的参数。例如,我们可以使用MAX宏从两个数中选出较大的一个,数的类型可以是int,long int,float,double等等。 |
|