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循环中预设了分号,而不是在花括号上预设。
非常感谢任何建议,
答案 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)
宏的原因是,您可以在源代码中使用宏并添加分号,而不会有额外的空语句。这主要是出于历史原因我猜,因为在很多情况下,空语句(即只有没有任何语句的分号)不会做任何事情。