【发布时间】:2021-04-02 11:50:57
【问题描述】:
以下想法在 C 中是否可行?
我到达失败。 (使用在线c编译器测试)
也许它可以使用 GOTO 解决,但这不是我们所希望的。
只是理论上的,如果我缺少任何其他解决方案,但想法是让状态机更高效一点。
#include <stdio.h>
#include <stdint.h>
uint8_t shouldhavebreaked = 0;
#define BREAK_CONDITIONAL(x,y) do { if(x == y) { shouldhavebreaked = 1; break ;} } while(0)
int main()
{
uint8_t swh = 0;
switch (swh)
{
case 0:
/*if state is same, break, otherwise fall-through*/
BREAK_CONDITIONAL(swh, 0);
case 1:
printf("failed \n");
break;
}
printf("changed? %d \n",shouldhavebreaked);
return 0;
}
【问题讨论】:
-
break退出宏内部的do循环,而不是switch。删除宏中的循环。 -
我建议写
if ( swh == 0 ) break;而不是用宏来混淆控制流 -
@M.M 一般来说,我同意,但在某些情况下(例如状态机),您可以使用一组符号宏来创建小型语言。
标签: c macros switch-statement break