#defineDOSOMETHING()\do{\action1();\action2();\}while(0)\ 宏被展开后,上面的调用语句会保留初始的语义,同时绝大部分编译器都能够识别do{...}while(0)这种无用的循环并进行优化,不会导致性能优化的降低。 小结 在Linux内核和驱动代码还有cocos2d-x中,很多宏实现都使用do{...}while(0)来包裹他们的逻...
do{ ... }while(0) 这样的代码相当于执行一次循环体,咋看之下似乎没有一点作用,其实大体上可以包含如下功能: 代码分块 辅助定义复杂的宏,避免出错 起到goto的功能 代码分块 do{}while(0)可用于代码分块,这样和直接使用{}的功能差不多,可以在块内定义局部变量而不必担心命名冲突: int a = 10; std::...
0、引言 我们在嵌入式开发的过程中,经常可以碰到在一些宏定义或者是代码段中使用了do {...} while(0)的语句,从语义上理解,do {...} while(0)内的逻辑就只执行一次,并没有循环执行,粗略看来,似乎画蛇添足了,那么为什么还需要在只执行一次的逻辑外面加上一层do {...} while(0)语句呢?实际上,在这些...
do{}while(0): 用0做参数,表示{}里的代码只运行一次,一般用法: #define LOG(x,y,z) do{x = 1; y = 1; z = 1;}while(0)
我们在嵌入式开发的过程中,经常可以碰到在一些宏定义或者是代码段中使用了do {...} while(0)的语句,从语义上理解,do {...} while(0)内的逻辑就只执行一次,并没有循环执行,粗略看来,似乎画蛇添足了,那么为什么还需要在只执行一次的逻辑外面加上一层do {...} while(0)语句呢?实际上,在这些逻辑中使用...
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1、避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: 这里最大的问题是代码冗余,每增加一个操作,就要做相应的错误处理,非常不灵活,于...
`do...while(0)` 在 C 语言中是一个惯用的技巧,通常用于宏定义。其主要目的是创建一个作用域,以便在宏中包含多个语句而不引入额外的问题。这种构造通常与 `if` 等条件语句一起使用,以确保宏在展开时不会引发语法错误。 考虑以下例子,其中使用了 `do...while(0)` 技巧: ...
}while(0) 1. 2. 3. 4. 5. 6. 7. 8. 9. 看到这,有同学就说了,这两个宏的作用不都是一样吗,因为do {}while(0)其实就是将{}中语句执行一遍,没错,可能大部分情况下,这两种宏展开后功能一样,都能很好的完成工作。比如说代码中调用fun(8),上面两种宏展开后最终都是执行f(8)后再去执行g(8),...
相当于就是{}里面的代码执行一次,你可以在代码中任何地方添加break退出代码执行