跳至内容
深圳市捷比信实业有限公司 · 产品选型与采购咨询联系业务人员
大功率无感电阻捷比信 · 专业器件主题站

函数宏的三种封装方法

1.函数宏简介函数宏是包含多个语句的宏定义。它们通常是经常调用的函数的语句封装,并且不想减少通过函数封装弹出堆栈和推送堆栈的开销。函数宏本质上是宏,可以直接定义,例如:#defineINT_SWAP(a,b)inttmp = a; a = b; = tmp但是上面的宏有一个明显的缺点:涉及if,while和其他语句,并且当您不使用花括号就调用该宏时,实际的作用范围在宏的第一个分号之后结束。也就是说,a = b和b = tmp不受控制语句的影响。因此,在工程中,通常使用三种方法来封装函数宏,即{}和do {。 ..} while(0)和({})。下面将对三种方法进行一对一分析,以比较它们的优缺点。 2. {}方法INT_SWAP宏使用{}来封装表单,如下所示:#defineINT_SWAP(a,b){inttmp = a; a = b; = tmp;}这时,不带花括号(例如,while)的直接调用控制语句都可以正常运行,例如:#defineINT_SWAP(a,b){inttmp = a; a = b; = tmp;} intmain(){intvar_a = 1; intvar_b = 2; INT_SWAP(var_a,Var_b); printf(“ var_a =%d,var_b =%d

",var_a,var_b); // var_a = 2,var_b = 1if(1)INT_SWAP(var_a,var_b); printf(“ var_a =%d,var_b =%d

",var_a,var_b); // var_a = 1,var_b = 2}但是,如果if语句中还有其他分支(elseif,else等),但没有大括号,例如:if(1)INT_SWAP(var_a,var_b); elseprintf(“ helloworld!

”);您会发现一个编译错误:../mnt/hgfs/share/pr_c/src/main.c:Inf​​unction' main&#39 ;: /mnt/hgfs/share/pr/c/src/main.c:18: 2:错误:没有其他的错误,这是因为INT_SWAP(var_a,var_b);最后; if的范围已终止,随后的else当然没有找到匹配的if。因此,有解决方案有两种类型,它们不被使用; (port.1)或规定必须使用带花括号的if(port.2),例如:/*port.1*/if(1)INT_SWAP(var_a,var_b)else {printf(“ Helloworld!

”);} / * Port.2 * / if(1){INT_SWAP(var_a,var_b);} else {printf(“ helloworld!

");}可见,请勿使用;调用方法在程序读取和使用方面存在扭曲。规定必须使用带花括号的if的调用方法是常识,因为宏函数应适用于任何语法。优缺点总结:优点:简单粗鲁。缺点:不能在没有花括号和分支的if语句中直接调用;可以直接调用而无需3.do {...} while(0)方法INT_SWAP宏使用do {...} while(0)之后的形式如下:#defineINT_SWAP(a,b)do {inttmp = a; a = b; = tmp;} while(0)do {...} while(0)表示{}中的语句仅执行一次,这与{}的功能一致。不同之处在于do {...} while(0)可以提前退出函数宏,将其集成到语句中并强制您必须使用;。因为do {...} while(0)实际上是一个while循环,所以可以使用关键字break尽早结束循环。使用此功能,可以为函数宏添加参数检测。例如:#defineINT_SWAP(a,B)do {if(a《 0 || b》 0)reak; inttmp = a; a = b; = tmp;} while(0),因为do {...} while(0);实际上是一种语法,编译器会考虑do {...} while(0);作为声明。因此,如果没有花括号和分支,可以使用do {...} while(0)方法的函数宏。直接在语句中调用。例如:#defineINT_SWAP(a,b)do {if(a《 0 || b》 0)reak; inttmp = a; a = b; = tmp;} while(0)intmain(){intvar_a = 1; intvar_b = 2; if(1)INT_SWAP(var_a,var_b); elseprintf(“ helloworld!

”); printf(“ var_a =%d,var_b =%d

&quot ;, var_a,var_b); // var_a = 2,var_b = 1return0;} C语言规定必须使用do {...} while(0)语法;作为声明的结尾。因此,具有以下语句的程序是不可能出现的:if(1)INT_SWAP(var_a,var_b)else {printf(“ helloworld!

优点和缺点的摘要:优点:支持直接调用if语句而没有花括号和分支;支持提前退出功能宏;在被迫致电时必须使用;缺点:没有返回值,不能用作表达式的右侧。使用了该值。 4.({})方法({})是GNUC扩展的语法,它不是C语言的本机语法。 INT_SWAP宏使用({})封装形式如下:#defineINT_SWAP(a,b)({inttmp = a; a = b; = tmp;})与do {...} while(0 ),({})支持直接调用if语句而没有花括号和分支。例如:#defineINT_SWAP(a,B)({inttmp = a; a = b; = tmp;})intmain(){intvar_a = 1; intvar_b = 2; if(1)INT_SWAP(var_a,var_b); elseprintf(“ helloworld!

&quo