宏定义define.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
宏定义define

/rusty/archive/2011/03/27/1996806.html #include stdio.h #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf(%d\n, f(1,2));//数12 printf(%s\n, h(f(1,2)));//字符串“12” printf(%s\n, g(f(1,2)));//“f(1,2)” return 0; } C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作 而##被称为连接符,用来将两边的符号连接为一个符号。 除带#、##运算符之外的宏定义,在宏替换之前要对实参本身进行充分的展开。 本题的输出是12和f(1,2),为什么会这样呢?因为宏定义的展开不象函数执行那样由里到外。 h(f(1,2)),由于h(a)是非#或##的普通宏,需要先宏展开其参数a,即展开f(1,2)为12,则h(a) 宏替换为h(12),进而宏替换为g(12), 进而宏替换为12。 #将右边的参数做整体的字符串替换,即便是另一个宏,也不展开,所以,g(f(1,2))-f(1,2)。 HYPERLINK /fly1988happy/archive/2012/04/10/2441402.html /fly1988happy/archive/2012/04/10/2441402.html 宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。 1.不带参数的宏定义: 宏定义又称为宏替换,简称“宏”。    格式:#define 标识符 字符串    其中的标识符就是所谓的符号常量,也称为“宏名”,字符串可以是常数、表达式、格式串等。 在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去替换,这称为“宏替换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏替换是由预处理程序自动完成的。 例:#define PI 3.1415926   把程序中出现的PI全部换成3.1415926    说明:    (1)宏名一般用大写 ;   (2)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义;   (3)预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查;    (4)宏定义末尾不加分号;   (5)宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头;    (6)可以用 #undef 命令终止宏定义的作用域 ;   (7)宏定义可以嵌套;    (8)字符串 中永远不包含宏, 的内容不能被替换;    (9)宏定义不分配内存,变量定义分配内存;    (10)宏定义不存在类型问题,它的参数是无类型的。 2.带参数的宏定义(函数式宏定义): 格式:#define 宏名(参数表) 字符串 2.1 例如:#define S(a,b) a*b    area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2;    类似于函数调用,有一个哑实结合的过程:    (1)实参如果是表达式容易出问题  #define S(r) r*r  area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b;    正确的宏定义是#define S(r) ((r)*(r))    (2)宏名和参数的括号间不能有空格。 (3)宏替换只是进行简单的做替换而已,不要在中间计算结果,一定要替换出表达式之后再算。 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存    (5)宏的哑实结合不存在类型,也没有类型转换。    (6)函数只有一个返回值,利用宏则可以设法得到多个值 (7)宏展开使源程序变长,函数调用不会    (8)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值) 2.2 下面比较函数式宏定义和普通函数的区别: 函数式宏定义:#define MAX(a,b) ((a)(b)?(a):(b)) 普通函数: MAX(a,b) { return (ab)? a : b;} (1)函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心。 (2)调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。 如果MAX是个普通函数,那么它的函数体return a b ? a : b; 要编译生成指令,代码中出现的每次调用也要编译生成传参指令

文档评论(0)

bm5044 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档