顷分相送!(什么是宏??)
什么是宏?
请给出详细解答!!
45分送!!
问题点数:45、回复次数:11Top
1 楼winhero()回复于 2002-04-26 14:50:32 得分 0
就是用#define语句定义的东西,如#define TURE 1,则程序中所有出现TURE的地方,在编译时都用1替换.Top
2 楼morningsing(奈何)回复于 2002-04-26 14:59:08 得分 10
宏语句在预编译的时候被处理,也就是在预编译时被宏体所替代。
它在某些地方与函数相似,但可省去函数调用的代价,但是代码长度会大一些。因为不管宏语句在代码中出现了多少次,每次都被完整的宏体所替代,而函数码在程序中只存在一次就可以了。Top
3 楼girlsjj(Lilain)回复于 2002-04-26 15:05:40 得分 0
那一般都用于什么地方?
利用宏解决什么问题??
(可加分!)Top
4 楼Sorcier(小巫师)回复于 2002-04-26 15:17:15 得分 0
MACRO一般用于简化一些烦琐又相同的操作步骤。 一般在 office 系列里用的比较多
Top
5 楼zhwangquan(聪明的大傻瓜)回复于 2002-04-26 15:18:34 得分 0
避免函数调用使用堆栈,以及参数入栈出栈占用CPU时间Top
6 楼fire_zxv(辉)回复于 2002-04-26 15:26:52 得分 0
MFC的
BEGIN_MESSAGE_MAP
END_MESSAGE_MAP
DECLARE_MESSAGE_MAP
消息映射就是对宏的经典应用Top
7 楼fhbkyo(光荣潜水员)回复于 2002-04-26 15:34:00 得分 0
定义一个变量为一个特定的值Top
8 楼free_free(free_free)回复于 2002-04-26 15:35:33 得分 10
宏是一段完成特定功能的代码和C++的内联函数相似
与函数的区别,是宏将代码复制到调用处,而函数是转去执行,如调用10次,则宏的代码被复制10次,而函数的代码只有一份。使用宏的速度快,但程序较大,使用函数程序较小,但相对速度要慢。
所以比较短小又使用频繁的功能适合做成宏,而相对大些的写成函数。
Top
9 楼lixiner(大汤姆狼)回复于 2002-04-26 15:41:33 得分 0
说一点 我自己的看法,请斧正!
为完成一定功能 例如:动态类型检验、串行化、消息循环
需要 为已有类添加各项支持
为使用户使用方便,就用#define简化为相关宏
宏大多用在比较通用的功能,一方面方便了用户
一方面也隐藏了实际操作
有时让人摸不到头脑Top
10 楼morningsing(奈何)回复于 2002-04-26 15:42:53 得分 10
关于宏用在什么地方:
其实这个东西的使用更多的是因为传统的原因,现在很多的C++专家都不推荐使用宏。因为它在编译前就被替换掉了,所以不具备类型安全的特性。
它的类似函数的功能可以用inline函数实现;定义常量的功能可以有const代替。Top
11 楼steedhorse(晨星)回复于 2002-04-26 15:53:55 得分 15
就是一些在编译时首先处理的替换规则。
比如
#define NUMBER 8
那么,在编译开始时,编译器将首先把该源文件中的NUMBER全部换成8。
所以,你千万别定义
#define n 8,
那样一来,文件中所有的晓小字母n将全被换成8。
当然,还有类似函数的替换,
比如,
#define PRINT(INT) printf("%d\n" , INT)
后面就可以使用PRINT(i)来打印i的值了。
但你同样需要注意,不能图简介,来一个
#define PRINT(n) printf("%d\n" , n)
那样一来,当调用PRINT(8)时,编译器会把它替换成:
pri8tf("%d\8" , 8)
明白了吧,宏定义执行的仅仅是简单的字符串替换。
当然,还有个问题需要注意,比如,你自己定义一个乘法宏:
#define PRODUCT(M , N) M*N
后面,你调用PRODUCT(3+2 , 5+4)
会被编译器替换成:
3+2*5+4,你本来想得到45,却得到了17。
所以上面的宏应该定义成
#define PRODUCT(M , N) (M)*(N)
宏定义主要就是上述的这两类:带参数的宏定义和不带参数的宏定义,有时候还会用到仅仅定义一个字符串,却不定义成任何东西的情况。如:
#define _DEBUG
这样的宏定义主要用来做条件编译。
比如,你调试程序的时候,可能会让程序输出许多中间结果,你就可以在前面来一个#define _DEBUG,然后把这些输出语句都编程下面的形式。
#ifdef _DEBUG
printf("%d" , tmp);
#endif
这样,等你的程序调试得差不多了,要发布了,不再需要输出这些中间结果了,你只需把文件头上的那句:
#define _DEBUG
注释掉,再编译一遍,就一些搞定了。
关于条件编译的知识,你还是找本书自己看看吧,随便一本C/C++书上都有,当然VC的编译预处理还要复杂的多。Top




