2

可能重复:
为什么在 C/C++ 宏中有时会出现无意义的 do/while 和 if/else 语句?

为什么我遇到的 C 源代码有时会被do...while(0)循环包裹?

do {
  parser->http_errno = e;                         
  parser->error_lineno = __LINE__;    
} while (0) 

为什么使用它,而不是这个:

parser->http_errno = e;                         
parser->error_lineno = __LINE__;    

我怀疑这与线程安全有关,但我不确定。

4

2 回答 2

2

这样做是为了您可以在宏中使用它,同时要求宏用户在末尾使用分号,就像常规语句一样。

换句话说,只要你想在一个类似函数的宏中包含多个语句FOO(...),你就可以将它包装起来,do { ... } while (0)这样宏的用户就可以(并且,事实上,必须)将它调用为FOO(x);,而不是简单地FOO(x)(缺少分号可以是对人类和计算机来说都很奇怪)。

于 2012-04-12T04:49:46.457 回答
0

您主要在宏中看到此类代码,它们的行为就好像它们是函数 #define 无论做什么...... while(0)

并且你像 What() 一样使用它;

我看到这个问题在 do { ... } while (0) 之前在这里得到了回答——它有什么用?

更正了链接,感谢符文。

于 2012-04-12T04:52:06.913 回答