从评论到这个答案:https://stackoverflow.com/a/459704/2812104
我尝试创建一个宏函数,它将函数作为参数并使用clock()
计时。但是我一直收到一条错误消息,指出start
未声明,我无法弄明白,因为我之前在宏中声明了它
(这在我的代码中都是在同一行,以防它有所不同;为了便于阅读,我在这里将它分成两行:)
#define timing(a): clock_t start = clock(); a; clock_t stop = clock();
printf("Elapsed: %f seconds\n", (double)(stop - start) / CLOCKS_PER_SEC);
答案 0 :(得分:3)
当前问题是timing(a)
之后的冒号 - 它想要在它之前加上标签,但你不能在变量定义上使用标签,所以你需要丢失冒号:
#define timing(a) \
clock_t start = clock(); \
a; \
clock_t stop = clock(); \
printf("Elapsed: %f seconds\n", (double)(stop - start) / CLOCKS_PER_SEC);
您还应该避免污染函数的名称空间。这样做的经典方法是do { … } while (0)
循环:
#define timing(a) \
do { \
clock_t start = clock(); \
a; \
clock_t stop = clock(); \
printf("Elapsed: %f seconds\n", (double)(stop - start) / CLOCKS_PER_SEC); \
} while (0)
这会创建一个语句块,即使在未受保护的if
块中也可以合法使用:
if (do_it_this_way)
timing(some_func(1, 37, 91));
else
timing(some_func(2, 41, 87));
如果您仅在宏体周围使用{ … }
,则会产生错误(因为91
后面的分号表示其他内容不属于任何if
- 扩展是if (do_it_this_way) { … }; else …
)。
Clock
,支持函数如:
extern void clk_init(Clock *clk);
extern void clk_start(Clock *clk);
extern void clk_stop(Clock *clk);
extern char *clk_elapsed_ms(Clock *clk, char *buffer, size_t buflen);
extern char *clk_elapsed_us(Clock *clk, char *buffer, size_t buflen);
extern char *clk_elapsed_ns(Clock *clk, char *buffer, size_t buflen);
调用代码创建并初始化Clock
,然后可以在循环之前启动时钟,在其之后停止时钟,并在其休闲时分析经过的时间。您可以在timer.c
和timer.h
的Github https://github.com/jleffler/soq/tree/master/src/libsoq上找到此代码。如果您使用术语' user:15168 clk_elapsed_us
'在SO上搜索,您可以找到使用它的示例。 (例如How to wrap around a range?)。