假设我想要一个适用于任何类型的 C 宏。我正在使用 GCC 编译器 (>= 4.6) 并且可以使用 GNU99 宏。
//code...
any_type_t *retVal = function_that_runs_very_long_time(a, b, &&c, **d, &e, *f);
//other code...
TIMER 宏的用法可以看起来像这样
//code...
any_type_t *retVal =
TIMER(
function_that_runs_very_long_time(a, b, &&c, **d, &e, *f),
"TIMING FOR VALUE <%d, %d>", a, b
);
//other code...
因此 TIMER 必须返回给定函数的值并打印其运行的持续时间。void
具有返回类型的函数存在问题。
我显然可以有两个宏,如 TIMER_TYPE 和 TIMER_VOID,但我想使用一个单独的对任何返回值的计时函数。
谢谢你的建议。
此 TIMER 宏的编辑示例
#define TIMER(expr, fmt_msg, ...) \
({ \
struct timeval before, after; \
uint64_t time_span; \
int time_span_sec, time_span_usec; \
gettimeofday(&before, NULL); \
typeof(expr) _timer_expr__ = (expr); \ // <- static if?
gettimeofday(&after, NULL); \
time_span = (after.tv_sec * 1000000 + after.tv_usec) \
- (before.tv_sec * 1000000 + before.tv_usec); \
time_span_sec = time_span / 1000000; \
time_span_usec = time_span % 1000000; \
TRACE(fmt_msg "\n%s : %d.%d seconds", \
#expr, time_span_sec, time_span_usec, ...); \
_timer_expr__; \
})