一般的宏嵌套展开规则是 由内向外 ,先将内层宏展开,再把外层宏展开:
输出:
嵌套宏 B(A(2)) 会先展开为 B((2 + 5)) ,然后再展开为 ((2 + 5) 5) ,所以最终结果为35
如果宏的参数直接带有 # ,则不会展开内层的嵌套宏
输出:
因为 STR 宏的参数直接带有 # ,所以 STR 内部嵌套的内容不会被进一步展开,故 STR(ADD(3, 4)) 输出为 ADD(3, 4) ;
因为 TO_STR 宏的内容并没有 # ,所以嵌套的宏 ADD(3, 4) 依旧可以展开,故 TO_STR(ADD(3, 4)) 输出结果为 (3 + 4) ;
如果宏的参数直接带有 ## ,则会先将参数通过 ## 拼接,然后再依次进行展开
输出:
由于 DEF_VAR 中带有 ## 所以会先将里面的内容使用 ## 拼接,所以会最先展开为 TO_STR(var_PARAM(10)) ,由于展开后 PARAM(10) 已经变成了 var_PARAM(10) ,已经不是有效的宏了,所以最终再经过 TO_STR 的转换后,结果就是 var_PARAM(10)
在C语言源程序中,允许用一个标识符来表示一个字符串,称为宏,宏定义是由源程序中的宏定义命令完成的,宏替换是由预处理程序自动完成的。宏定义是C提供的三种预处理功能的其中一种,这三种预处理包括:宏定义、文件包含、条件编译。
C语言中,预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行相应的转换,预处理过程还会删除程序中的注释和多余的空白符号。
预处理指令是以#开头的代码行,#必须是该行除了空白字符外的第一个字符。#后是指令关键字,在#和指令关键字之间允许存在若干空白字符。
宏的用途
在于自动化频繁使用的序列或者是获得一种更强大的抽象能力。
计算机语言如C语言或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C语言的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
Lisp类语言如Common Lisp和Scheme有更精巧的宏系统:宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。
百度百科-宏定义
宏定义
c程序提供的预处理功能之一。包括带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。形式为:
#define
标志符(参数表)
字符串
宏名
在上定义中的标志符被称为“宏名”。
宏展开
在c程序编译时将宏名替换成字符串的过程称为“宏展开”。
define
是对宏的定义:就你这个而言,定义了一个宏m,代表100也就在下面的程序中只要是遇到变量m,它的值就是100
#define
M(x,y,z)xy+z
如果写M(a+b,b+c,c+a)
这时a+b对应x
b+c对应y
c+a对应z
然后直接代入xy+z
结果是:
a+b
b+c
+
c+a
x
y +
z
注意不要自己加引号,就直接展开
以上就是关于C语言嵌套宏的展开规则全部的内容,包括:C语言嵌套宏的展开规则、宏定义c语言是什么意思、#define 中 #与##的作用,c语言中!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)