相关疑难解决方法(0)

为什么在宏中使用明显无意义的do-while和if-else语句?

在许多C/C++宏中,我看到宏的代码包含在看似无意义的do while循环中.这是一些例子.

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
Run Code Online (Sandbox Code Playgroud)

我看不出它do while在做什么.为什么不在没有它的情况下写这个?

#define FOO(X) f(X); g(X)
Run Code Online (Sandbox Code Playgroud)

c c++ c++-faq c-preprocessor

758
推荐指数
8
解决办法
9万
查看次数

做{...} while(false)

我正在看一些个人的代码,并注意到他的功能似乎有一个模式:

<return-type> function(<params>)
{
 <initialization>

 do
 {
   <main code for function>
 }
 while(false);

 <tidy-up & return>
}
Run Code Online (Sandbox Code Playgroud)

它不错,更奇特(实际代码相当简洁且不足为奇).这不是我以前见过的东西,我想知道是否有人能想到它背后的任何逻辑 - 也许是用不同语言的背景?

c++

117
推荐指数
11
解决办法
3万
查看次数

do-while-false循环是常见的吗?

前一阵子我改变了我处理c风格错误的方式.

我发现很多代码看起来像这样:

int errorCode = 0;

errorCode = doSomething();
if (errorCode == 0)
{
   errorCode = doSomethingElse();
}

...

if (errorCode == 0)
{
   errorCode = doSomethingElseNew();
}
Run Code Online (Sandbox Code Playgroud)

但最近我一直这样写:

int errorCode = 0;

do
{       
   if (doSomething() != 0) break;
   if (doSomethingElse() != 0) break;
   ...
   if (doSomethingElseNew() != 0) break;
 } while(false);
Run Code Online (Sandbox Code Playgroud)

我已经看到很多代码在出现错误后没有执行任何内容,但它始终以第一种方式编写.有没有其他人使用这种风格,如果你不这样做,为什么?

编辑:只是为了澄清,通常这个构造使用errno否则我会int在打破之前将值赋值给.此外,通常还有更多代码,而不仅仅是if (error == 0 )子句中的单个函数调用.但是,要考虑很多好点.

c c++ coding-style

25
推荐指数
5
解决办法
7546
查看次数

"{{}} while(0)"在内核代码中的作用是什么?

可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
C多行宏:do/while(0)vs scope block

我已经看到了很多这样的用法,以前我是程序员想要轻松打破一段代码.为什么我们需要在这里执行while {...} while(0)循环?我们试图告诉编译器一些东西吗?

例如,在Linux内核2.6.25中,包含/ asm-ia64/system.h

/*
 * - clearing psr.i is implicitly serialized (visible by next insn)
 * - setting psr.i requires data serialization
 * - we need a stop-bit before reading PSR because we sometimes
 *   write a floating-point register right before reading the PSR
 *   and that writes to PSR.mfl
 */
#define __local_irq_save(x)         \
do {                    \
    ia64_stop();                \
    (x) = ia64_getreg(_IA64_REG_PSR);   \
    ia64_stop();                \
    ia64_rsm(IA64_PSR_I);           \
} while (0)
Run Code Online (Sandbox Code Playgroud)

c kernel linux-kernel

20
推荐指数
4
解决办法
6026
查看次数

标签 统计

c ×3

c++ ×3

c++-faq ×1

c-preprocessor ×1

coding-style ×1

kernel ×1

linux-kernel ×1