C语言的宏定义.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C 语言中的宏定义 SUNNY.MAN 宏定义 格式: #define 标识符 字符串 其中的标识符就是所谓的符号常量,也称为“宏名”。 预处理(预编译)工作也叫做宏展开,就是把宏名替换为字符串。 为什么要使用宏定义 我认为主要有两点:1.增强程序的可读性 2.增强程序的可移植性int a=16; int *a=(int *)0; 如果我们都是把 int 当 32 位来处理的,有一天我们的程序需要把int 当16 位来处理,你怎么办呢? #define int int16//请注意这个 int16 才是真正的类型 (int *)0;也不好看啊。我们喜欢用 NULL,那也定义一个宏好了。#define NULL (myint *)0 宏定义的作用域 这是我写这文的目的。请看下面的小例子 Int sum(int a); Int main(void) { Int a=sum(1); Int b=MM; Return 0; } Int sum(int a) { #define MM 123 Return a+MM; } 这个程序在编译的时假会产生一个类似于下面的错误: MM undeclared (first use in this function) 。所以切记宏展开的位置是在文件中的位置,而不是调用它的位置。运行和编译是两个阶段。 如果 1.c 文件中#undef MM #define MM 10 2.c 文件中#undef MM #define MM 20 那么到底是 MM 被定义为 10 呢还是 20 呢。请记住宏展开的时机是预处理阶段而不是编译阶段,预处理阶段不检查语法错误。也就是文件 1 中的还是 10,文件 2 中的还是 20。 宏的基本使用 宏定义末尾不需要像语句一样加分号,但你可以根据需要自己进行添加; 宏定义不管写在函数的花括号里外边,作用域为其后的程序行,通常在文件的 最开头。 可以用#undef 命令终止宏定义的作用域 宏定义允许嵌套 字符串( )中不会进行宏替换 例如:#define TEST this is a test 程序行中有TEST时不会替换为”this is a test”. 宏定义的第二个“标识符”必须是合法的 C 语言的标识符。但可以是关键字 #define int(format,...) fprintf(stdout,format,## VA_ARGS ) int main(int argc,char *argv[]) { int(this is a\n); return 0; } 注意:在这里 int 还是 int 只有 int(format)才不是 int 了。一定要记住宏替换是大小写敏感,全字匹配,并且必须参数匹配,或是有,或是没有,或是多个。 替换的内容中,内的字符不被当成形参,即使它和一模一样。例如:fun(a) “a”这里的”a”就是字符串 a,而不是参数 a. Fun(345)将会被替换成”a”而不是”345” 如果想替换为”345”请像下面这样定义 Fun(a) #a 如此一来 Fun(345)将会被替换为”345”。 宏在展开时如果遇到#或是##将不会再展开。#define INT_MAX 12345 #define str(str) #str 如果用 str(INT_MAX)将会输出”INT_MAT”而不是”12345” 原因。当语法分析时,首先找到了constr(参数),于是查找constr 标识符,一看是一个宏于是替换为 printf(this is a %s\n,”INT_MAX”);现在INT_MAX 已经不存在了,变成了” INT_MAX”.当然不存在替换了。 那如何才能让他继续替换呢。 答案如下: #define INT_MAX 12345 #define constr(a) #a #define str(a) constr(a) printf(this is a %s\n,str(INT_MAX)); 解释一下为什么: 第一次宏替换时 str(INT_MAX)被替换为 constr(INT_MAX), 此时搜索到左边括号. 接着向右搜索 INT_MAT 也被替换为 12345 这时候变成了 constr(12345),这也完成了第一步宏替换。接着进行 第二次宏替换搜索。 搜到 constr(12345)此时被替换为”12345”,从而完成替换。8.用来填充一个结构 #define FILL(a) {a, #a} enum IDD{OPEN, CLOSE}; typedef struct MSG { IDD id; const char * msg; }MSG; MSG _msg[] = {FILL(OPEN), FILL(CLOSE)}; 这相当

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

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

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档