什么是宏?

来源:互联网 发布:xp网络连接ip地址设置 编辑:程序博客网 时间:2024/05/22 13:07

宏语句在预编译的时候被处理,也就是在预编译时被宏体所替代。  
它在某些地方与函数相似,但可省去函数调用的代价,但是代码长度会大一些。因为不管宏语句在代码中出现了多少次,每次都被完整的宏体所替代,而函数码在程序中只存在一次就可以了。

 

宏是一段完成特定功能的代码,和C++的内联函数相似。

与函数的区别,是宏将代码复制到调用处,而函数是转去执行,如调用10次,则宏的代码被复制10次,而函数的代码只有一份。使用宏的速度快,但程序较大,使用函数程序较小,但相对速度要慢。

所以比较短小又使用频繁的功能适合做成宏,而相对大些的写成函数。

 

就是一些在编译时首先处理的替换规则。

比如:

#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)时,编译器会把它替换成:
printf("%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的编译预处理还要复杂的多。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 k宝密码锁住了怎么办 农业银行k宝锁了怎么办 银行卡办的网银卡丢了怎么办 事业单位考察档案丢了怎么办 当兵政审家访家里没人在家怎么办 士兵转业结婚材料不全怎么办 体育生训练腿疼怎么办 车底盘刮的严重怎么办 新车底盘被刮了怎么办 车侧面刮凹了怎么办 憋气久了想呕吐怎么办 19岁网贷欠了3万怎么办 大学生欠2w网贷怎么办 当兵去了网贷怎么办 考公安视力不过关怎么办 身份证号和姓名电话泄露了怎么办 黑色裙子被染色了怎么办 戴墨镜鼻子太塌怎么办 戴墨镜鼻子有印怎么办 戴眼镜鼻梁塌了怎么办 站的时间长了腿疼怎么办 小孩腿筋拉伤了怎么办 走多了小腿骨疼怎么办 走多了一个腿疼怎么办 走太多路腿酸痛怎么办 老年人脚肿并痛怎么办 孩子蛙跳肌后大腿痛怎么办 走路久了腿酸怎么办 走路多了膝盖痛怎么办 走路多了小腿痛怎么办 走多了腿疼怎么办 小腿走多了酸痛怎么办 腿肚受凉了酸痛怎么办 晚上腿疼的睡不着觉怎么办 走路走多了腿酸怎么办 跳完蛙跳大腿疼怎么办 走路走多了脚疼怎么办 走太多路脚酸痛怎么办 走路走的腿酸痛怎么办 路走得太多腿疼怎么办 走路走的足弓疼怎么办