#define

来源:互联网 发布:网页在线客服软件 编辑:程序博客网 时间:2024/04/30 04:47

define的用途

(1)在#define name stuff这条指令中,在程序中每当出现name时,预处理器就会把它自动替换成stuff。替换文本并不仅限于数值字面常量,可以是任何文本。
#define reg register //为register这个关键字创建一个简短的名字
#define CASE break;case //以便在写case语句时候自动把break写上
#define DEBUG_PRINT printf(“file:%s\tline:%d\t\
date:%s\ttime:%
s\n”\
FILE,LINE, __
DATE__,TIME)
//如果定义的stuff 过长,可以分成几行写,除了最后一行外,每一行的后面都加一个反斜杠
注意:在使用DEBUG__PRINT时一般在后面加上“;”,所以在定义宏的时候就不要再加“;”了。(这是一个好的编程习惯)
#define PROCESS_LOOP \
for(i=0;i<10;i++)\
{sum+=i;\
if(i>0)\
prod*=i;} //可以把序列语句指令插入到程序中
(这种技巧不要轻易使用,如果相同的代码项出现在程序的各个地方,更好的办法是把它实现成一个函数)
(2)宏
define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏
宏的声明方式:#define name(parameter-list) stuff
其中parameter-list是由逗号隔开的符号表,它们可能出现在stuff中,参数列表的左括号必须与name紧邻。如果有空白就会被解释为stuff中的一部分。一般在宏定义表达式两边加上一对括号,例:#define DOUBLE(x) ((x)+(x)) 避免产生歧义。
替换:在程序中扩展#define定义符号和宏时,需要几个步骤:在调用宏时,对参数进行检查,看是否包含任何由#define定义的符号,如果是它们首先被替换。替换文本随后被插入到程序原来文本位置。最后再次对结果进行扫描,看是否包含由#define定义的符号,如果有就重复上述处理过程。
宏参数和#define定义可以包含其他#define定义的符号,但不能出现递归。
将宏参数插入字符串常量中:
邻近字符串连接特性:
例如:
#define M 9
#define PRINT(FORMAT,VALUE) printf(“the value is”FORMAT”\n”,VALUE);PRINT(“%d”,M);
使用预处理器将一个宏参数转换成一个字符串:
#define M 9
#define PRINT(FORMAT,VALUE) printf(“the value of”#VALUE”is”FORMAT”\n”, VALUE);PRINT(“%d”,M);
(3)宏和函数
宏相对于函数的优缺点: 宏可以非常频繁的用于执行简单的计算,宏是类型无关的。但是在每次使用宏时,一份宏定义代码的拷贝将插入到程序中,除非宏非常短,否则使用宏可能会大幅度增加程序的长度。还有一些任务是函数根本无法实现的。
函数相对于宏的优缺点:用于调用和从函数返回的代码很可能比实际执行这个小型计算工作量更大,使用宏比使用函数在程序规模和速度更胜一筹。但是函数的参数必须申明为一种特定的类型,所以它只能在类型合适的表达式上使用。
注意:宏的名字全是大写

0 0