为什么C源代码有时用do ... while(0)循环包装?

时间:2012-04-12 04:47:16

标签: c

  

可能重复:
  Why are there sometimes meaningless do/while and if/else statements in C/C++ macros?

为什么我运行的C源代码有时包含do...while(0)循环?

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

为什么要使用它,而不是:

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

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

2 个答案:

答案 0 :(得分:2)

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

换句话说,只要你想在类似函数的宏FOO(...)中使用多个语句,就可以用do { ... } while (0)包装它,这样宏的用户就可以了(和事实上,必须)将其称为FOO(x);,而不仅仅是FOO(x)(对于人类和计算机而言,分号的缺失可能很奇怪)。

答案 1 :(得分:0)

你看到这些代码主要在宏中,它们的行为就像它们的功能一样   #define无论做什么.....而(0)

你就像使用它一样 无论();

我看到这个问题之前已经回答了 do { ... } while (0) — what is it good for?

更正了链接,谢谢符文。