gpt4 book ai didi

c - 如何使这个函数定时宏在 C 中工作?

转载 作者:行者123 更新时间:2023-12-03 09:11:41 26 4
gpt4 key购买 nike

来自对此答案的评论: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);

最佳答案

最直接的问题是 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);

您可能还应该避免污染函数的 namespace 。经典的方法是使用 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)

这将创建一个即使在不 protected if block 中也可以合法使用的语句 block :

if (do_it_this_way)
timing(some_func(1, 37, 91));
else
timing(some_func(2, 41, 87));

如果在宏主体周围仅使用 { … },则会生成错误(因为 91 后面的分号意味着 else 不属于任何 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);

调用代码创建并初始化一个时钟,然后可以在循环之前启动时钟,在循环之后停止时钟,并在闲暇时分析耗时。您可以在 Github https://github.com/jleffler/soq/tree/master/src/libsoq 上找到此代码在timer.ctimer.h中。如果您使用术语“user:15168 clk_elapsed_us”(例如 How to wrap around a range? )在 SO 上搜索,您可以找到使用它的示例。

关于c - 如何使这个函数定时宏在 C 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41929712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com