任意の型で動作する 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 のような 2 つのマクロを使用できますが、任意の戻り値で関数を時間指定する単一の関数を使用したいと考えています。
提案していただきありがとうございます。
この 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__; \
})