6

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

gcc (GCC) 4.7.2
c89

你好,

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

通常我对所有事情都使用 do..while(0) 。但我见过一些项目,他们只使用花括号,我不确定哪个更好。

做..虽然

#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 循环而不是花括号上。

非常感谢您的任何建议,

4

3 回答 3

8

花括号版本将打破这样的用法:

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

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

于 2012-12-07T09:20:16.780 回答
4

您将遇到此代码的问题:

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

因此,如果您使用不带分号的 do-while-Macro,就可以了。

于 2012-12-07T09:21:51.653 回答
2

通常宏中没有分号do { ... } while (0)

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

于 2012-12-07T09:15:31.047 回答