功能像宏花括号或do..while

时间:2012-12-07 09:08:01

标签: c macros

  

可能重复:
  Do-While and if-else statements in C/C++ macros

gcc (GCC) 4.7.2
c89

您好,

我有以下类似函数的宏,只是想知道跨多行使用时的首选用法。最好使用花括号或do..while(0)循环。

通常我会使用do..while(0)来表示一切。但是我看到一些他们只使用花括号的项目,我不确定哪一个更好。

do..while

#define DSO_ERROR(msg, res_handle_module, mem_pool, size)   do {        \
        char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);      \
        apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
        LOG_ERR("%s dso error %s", (char*)msg, dso_error);              \
        goto dso_failure;                                               \
    } while(0); 

花括号

#define DSO_ERROR(msg, res_handle_module, mem_pool, size) {             \
        char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size);      \
        apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
        LOG_ERR("%s dso error %s", (char*)msg, dso_error);              \
        goto dso_failure;                                               \
    }

唯一的区别是在do..while循环中预设了分号,而不是在花括号上预设。

非常感谢任何建议,

3 个答案:

答案 0 :(得分:7)

花括号版本会破坏这样的用法:

if( foo )
  DSO_ERROR("Foo occured!", my_module, the_pool, 4711);
else
  printf("All is well, there is no foo\n");

这是do ... while(0)构造的原因。所以这似乎值得避免。

答案 1 :(得分:4)

您将遇到此代码的问题:

if (one) 
  DSO_ERROR("one", ...);
else
  DSO_ERROR("two", ...);

所以如果你使用do-while-Macro而不用分号,你会没事的。

答案 2 :(得分:2)

通常你在宏的do { ... } while (0)上有分号。

您拥有do { ... } while (0)宏的原因是,您可以在源代码中使用宏并添加分号,而不会有额外的空语句。这主要是出于历史原因我猜,因为在很多情况下,空语句(即只有没有任何语句的分号)不会做任何事情。