Chinaunix首页 | 论坛 | 博客
  • 博客访问: 591330
  • 博文数量: 68
  • 博客积分: 2621
  • 博客等级: 少校
  • 技术积分: 1498
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-23 21:04
文章分类

全部博文(68)

文章存档

2013年(8)

2012年(52)

2010年(8)

分类: C/C++

2010-11-29 22:38:06

在说关于有关宏定义的知识前,要先说一个概念。

预处理命令:在编译源程序前先对源程序进行处理。
           用#表示该行为编译预处理命令。
在C语言编程中加入一些编译预处理命令可以提高编程效率,加快编译速度。
注:预处理命令不是C语言的一部分,因此每条编译预处理命令不需要以分号来结束。

宏定义就属于预处理命令的一种。那么,什么是宏呢?
:c语言标准允许在程序中用一个标识符来表示一个字符串。标识符就是宏名。
宏替换:宏替换就是宏定义在编译预处理中,将程序中所有的宏名用相应的字符串来替换,这个过程称为宏替换。

宏分为两种:
1、无参数宏   #define 标识符 字符串
2、带参数宏   #define 标识符(形参表) 字符串

因为无参数宏比较简单,所以重点说一下带参数宏。

e.g.  #define MUL(x,y) x*y

* 首先,说一下应该要注意的问题或者说是容易犯错的地方。
  1、宏替换后没有;(分号),因为它不是语句;
  2、宏名与形参表的圆括号之间不能有空格,否则会导致错误;
     如上面的例子,MUL与(之间不能有空格。
  3、在宏替换中,字符串内的形参最好用括号括起来,以避免错误。
     如上面的例子,x*y应写为(x)*(y)
     因为宏定义的过程本质是替换,所以若x=a+1,y=b+1,那么,按原来的,
     就为 a+1*b+1,而不是我们想表示的(a+1)*(b+1)了。
  因此,我个人习惯将宏定义叫做宏替换。

* 其次,要说明带参数宏定义与函数的区别,因为二者比较相像,很容易搞混,所以在这里说明一下。
  1、带参数的宏的形参不是变量,不分配内存空间,无需说明数据类型;
     函数的形参是变量,分配内存空间,在函数定义时要指明参数的数据类型。

  2、预处理程序认为有参数的宏的实参是字符串,并用字符串去替换形参;
     函数则会计算实参的值,再去传给形参。

  3、宏替换会在编译时使编译时间变长,而运行时间不会;
     函数调用则会占用运行时间。


注:以上内容是参考人民邮电出版社的《LINUX C编程实战》,由童永清老师和吴伟民老师编著的
  
阅读(4416) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-12-03 00:40:52

建议再把typedef 和 #define 两者结合起来,会效果更好,,