【发布时间】:2012-11-25 10:42:48
【问题描述】:
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 循环而不是花括号上。
非常感谢您的任何建议,
【问题讨论】:
-
天哪,这是丑陋的代码。 (无意冒犯,我只是很惊讶)。
-
在
do { ... } while (0)的末尾添加分号首先破坏了使用do { ... } while (0)的目的。仅大括号版本的缺点是不能编写if (something) DSO_ERROR(...); else { ... },因为分号是if之后的空语句,而else是语法错误。使用do { ... } while (0)的更正版本,if/else符号的工作方式与您所期望的一样,如果宏实际上是一个函数。