如何在C中使此功能定时宏工作?

时间:2017-01-30 05:49:30

标签: c time macros

从评论到这个答案: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);

1 个答案:

答案 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.ctimer.h的Github https://github.com/jleffler/soq/tree/master/src/libsoq上找到此代码。如果您使用术语' user:15168 clk_elapsed_us'在SO上搜索,您可以找到使用它的示例。 (例如How to wrap around a range?)。

相关问题