相关疑难解决方法(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万
查看次数

C多行宏:do/while(0)vs scope block

可能的重复:
当我们定义一个宏时,do(0)有什么用?
为什么在C/C++宏中有时会出现无意义的do/while和if/else语句?
做{...}而(0)有什么好处?

我已经看到一些包含在do/while(0)循环中的多行C宏,如:

#define FOO \
  do { \
    do_stuff_here \
    do_more_stuff \
  } while (0)

与使用基本块相反,以这种方式编写代码有什么好处(如果有的话):

#define FOO \
  { \
    do_stuff_here \
    do_more_stuff \
  }

c macros multiline

173
推荐指数
1
解决办法
10万
查看次数

当我们定义宏时,do while(0)有什么用?

可能重复:
C/C++宏中的Do-while和if-else语句

我正在阅读linux内核,我发现了很多像这样的宏:

#define INIT_LIST_HEAD(ptr) do { \
    (ptr)->next = (ptr); (ptr)->prev = (ptr); \
} while (0)
Run Code Online (Sandbox Code Playgroud)

为什么他们使用这个而不是简单地在{}中定义它?

c macros linux-kernel

125
推荐指数
2
解决办法
5万
查看次数

在C中使用do-while-false的情况?

最近,我看到越来越多的代码片段使用以下模板:

do {
    ... some code ...
} while (false);
Run Code Online (Sandbox Code Playgroud)

为什么要这样做?如果我没有弄错,代码将只运行一次,因此似乎不需要循环.

我对这种风格的主要遇到的是Windows驱动程序,以及某些API中的低级操作.

c

1
推荐指数
1
解决办法
321
查看次数

标签 统计

c ×4

macros ×2

c++ ×1

c++-faq ×1

c-preprocessor ×1

linux-kernel ×1

multiline ×1