do{}while(0)在宏定义中作用

在开源代码中看到,宏定义经常这样用

#define	some()
	do {
		do_somt_thing();
	} while (0)

为什么这样用?

可以试一下,假如一个普通宏定义

#define some(x) Fun1(x);Fun2(x)
if(condition)
	some(x);

变为

if(condition)
	Fun1(x);
	Fun2(x);

这样直接加个花括号不久行了,为什么还用do......while()?假如加上花括号

#define some(x) {Fun1(x);Fun2(x);}
if(condition)
	some(x);
else
	someelse(x);

变为

if(condition)
{
	Fun1(x);
	Fun2(x);
};//多了个分号
else
	someelse(x);

因此宏定义中使用do...while(0)可以确保不管在代码中怎么使用宏定义,它总是正确的。

时间: 2024-10-03 14:46:42

do{}while(0)在宏定义中作用的相关文章

do...while(0)在宏定义中的巧妙用法

大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) do { if(NULL != p) delete p; p = NULL; }while(0) 这时,do-while(0)的功能就不仅仅是循环了,这是do..while(0)的一种巧妙用法.它有以下几种功能: 1.在后面要加分号,使调用如同函数:调用如下: int* p = new int(5)

do{...}while(0)在宏定义中的作用

如果你是一名C程序员,你肯定熟悉宏,它们非常的强大,如果正确使用可以让你的工作事半功倍.然后,如果你在定义宏时,很随意没有认真检查,那么它们可能使得你发狂,浪费N多时间.在很多C程序中,你可能看到许多看起来不是那么直接的较为特殊的宏定义.下面就是一个例子: 1 #define _set_taks_state(tsk, state_value) 2 do{tsk->state = state_value;}while(0) 在Linux内核和其他一些著名的C库中有许多使用do{...}while(

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

C 语言宏定义中使用do...while(0)

最近看到C语言的项目中在宏定义中使用了do...while(0),感到是个知识点,特来总结. 先看这句话:do{...}while(0)在C中是唯一的构造程序,让你定义的宏总是以相同的方式工作,这样不管怎么使用宏(尤其在没有用大括号包围调用宏的语句),宏后面的分号也是相同的效果.这句话的意思是说,在宏定义中使用do...while(0)包含的所有语句是一个代码块,不会受到{}:的影响. 看一个例子: #include <stdio.h> #include <stdlib.h> #d

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

宏定义中##和#的作用

解释1 : 定义中##和#的作用内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:1. ####是一个连接符号,用于把参数连在一起例如:> #define FOO(arg) my##arg则> FOO(abc)相当于 myabc2.#:是"字符串化"的意思.出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:> #define STRCPY(dst, src) strcpy(dst, #src)则> STRC

#和##在宏定义中使用问题

转自:http://www.linuxidc.com/Linux/2014-06/102925.htm 有一道经典的C语言问题,关于宏定义中#和##符号的使用和宏定义展开问题 程序如下: #include <stdio.h>#define f(a,b) a##b#define g(a)  #a#define h(a) g(a) int main(){        printf("%s\n", h(f(1,2)));        printf("%s\n&quo

define宏定义中的#,##,@#及\符号

define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (stringizing)字符串化操作符.其作用是:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串.其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前. 如: #define example(instr) printf("the input string is:\t%s\n",#

C宏定义中的连接符&quot;##&quot;和字符串化操作符&quot;# &quot;及变参宏&quot;...&quot;

C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念). 1.宏定义中字符串化操作符#: #的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号. 例如: #define WARN_IF(EXPR)do { if (EXPR) fprintf(stderr, "Warning: " #EXPR "\n");} while(0) 上面代码中的反斜线\主要用来转译换行