gpt4 book ai didi

代码段作为宏参数

转载 作者:太空宇宙 更新时间:2023-11-04 08:03:57 25 4
gpt4 key购买 nike

为了调试目的,我定义了下面的宏

#define SECTION_TIME(out, s) GPIO_SetOut(out); \
s \
GPIO_ClrOut(out);

用法:

SECTION_TIME(GPIO_fooOut,
foo();
bar();
foo=bar^foo;....;....;
)

目标:需要测量一些代码的时间。有时这个宏不会编译。我错过了什么吗?PS:我还尝试用 {}

包围我的代码
error: macro "SECTION_TIME" passed 6 arguments, but takes just 2

最佳答案

当代码走路像鸭子,说话像鸭子时,它最好完全像鸭子一样行事。我的意思是 SECTION_TIME(GPIO_fooOut, ...)(有点)看起来像一个语句,而实际上它映射到 3 个或更多语句。这很糟糕,您应该努力使它真正成为一个声明。

这其实并不难,常用的习惯用法是将宏内容包装在 do { ... } while (0) 没有尾随分号(以便将尾随分号提供给宏调用的末尾)。

所以你至少应该把你的宏改成类似的东西

#define SECTION_TIME(out, s) \
do { \
GPIO_SetOut(out); \
s; \
GPIO_ClrOut(out); \
} while (0)

另请注意,您应该将 s 的终止分号放在宏中,而不是参数中。所以应该像这样调用宏

SECTION_TIME(GPIO_fooOut,
foo();
bar();
foo=bar^foo;....;....
);

根据用例,使用 SETION_TIME_BEGIN 和 SECTION_TIME_END 的建议可能是更好的解决方案。

关于代码段作为宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44063766/

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