1函数宏简介函数宏是包含多个语句的宏定义。它们通常是经常调用的函数的语句封装,并且不想通过函数封装来减少弹出和推入堆栈的开销。函数宏本质上是宏,可以直接定义,例如:#defineINT_SWAP(a,b)inttmp = a; a = b; b = tmp但是上面的宏有一个明显的缺点:涉及if,while和其他语句当您不使用花括号就直接调用宏时,实际的作用范围将在宏的第一个分号之后结束。也就是说,a = b和b = tmp不受控制语句的影响。因此,在工程中,通常使用三种方法来封装函数宏,即{},do {...} while(0)和({})。下面将对三种方法进行一对一分析,以比较它们的优缺点。 strongHuang2 {} {}封装INT_SWAP宏的方式如下:#defineINT_SWAP(a,b){inttmp = a; a = b; b = tmp;}此时,无需花括号就直接调用控制语句(例如If,while)调用都可以正常运行,例如:#defineINT_SWAP(a,b){inttmp = a; a = b; 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:Infunction' main':/ mnt / hgfs / share /pr_c/src/main.c2:error:' else'没有上一个' if' else这是因为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语句中直接调用它;它可以直接调用而无需;。 StrongHuang3do {...} while(0)方法INT_SWAP宏使用do {...} while(0)来封装以下形式:#defineINT_SWAP(a,b)do {inttmp = a; a = b; b = tmp; } while(0)do {...} while(0)意味着只执行一次{}中的语句,这与{}的功能在外观上是一致的。区别在于do {...} while(0)可用于及早退出函数宏,将其集成到语句中并强制执行调用;必须使用。由于do {...} while(0)实际上是一个while循环,因此可以使用关键字break提前结束循环。使用此功能,可以将参数检测添加到功能宏。例如:#defineINT_SWAP(a,b)do {if(a由于do {...} while(0);实际上是一种语法,因此编译器将do {...} while(0);作为语句因此,可以在if语句中直接调用do {...} while(0)方法的函数宏,而无需使用花括号和分支。例如:#defineINT_SWAP(a,b)do {if(aC语言规定,必须使用do {...} while(0)语法;作为该语句的结尾,因此,不可能有一个带有以下语句的程序:if(1)INT_SWAP(var_a,var_b)else {缺点:优点:支持在if语句中直接调用而没有花括号和分支;支持早期退出函数宏;必须在强制调用时使用;缺点:没有返回值,不能用作表达式的右值。StrongHuang4({})方法({})是GNUC扩展的语法,不是C语言的本机语法。INT_SWAP宏用({})封装为以下形式:#defineINT _SWAP(a,b)({inttmp = a; a = b; b = tmp;})与do {...} while(0),({})支持不带花括号和分支的if语句直接调用。例如:#defineINT_SWAP(a,b)({inttmp = a; a = b; b = tmp;})intmain(){intvar_a = 1; intvar_b = 2; if(1)INT_SWAP(var_a,var_b); elseprintf (“ helloworld!”); printf(“ var_a =%d,var_b =%d”,var_a,var_b); // var_a = 2,var_b = 1return0;}与do {...} while(0 ),({})无法退出函数宏并不能及早支持返回值。 ({})毕竟不是while循环。很容易理解,您不能直接使用break退出函数宏。支持返回值是什么意思?答案是最后一个状态的结果