c++ - 用其他东西替换宏内的 goto
问题描述
我正在尝试删除Mach7中的 goto 语句,因为constexpr 函数中不允许 goto:
#define MatchQ(s) { \
XTL_MATCH_PREAMBULA(s) \
enum { __base_counter = XTL_COUNTER }; \
typedef mch::unified_switch<source_type> switch_traits; \
XTL_PRELOADABLE_LOCAL_STATIC(XTL_CPP0X_TYPENAME switch_traits::static_data_type,static_data,match_uid_type,XTL_EMPTY()); \
XTL_CPP0X_TYPENAME switch_traits::local_data_type local_data; \
bool processed = false; \
size_t jump_target = switch_traits::choose(subject_ptr,static_data,local_data); \
XTL_CONCAT(ReMatch,__LINE__): \
switch (jump_target) \
{ \
XTL_NON_REDUNDANCY_ONLY(default:) \
{ XTL_REDUNDANCY_ONLY(try){{ \
if (switch_traits::on_default(jump_target,local_data,static_data)) \
goto XTL_CONCAT(ReMatch,__LINE__); \
XTL_SUBCLAUSE_FIRST
上面的代码在这里使用了 goto: goto XTL_CONCAT(ReMatch,__LINE__);
,可以跳转到 switch 语句的上方。
如何在这里用其他东西替换 goto?
解决方案
在@ozlsn and 的帮助下gcc -E
,替换完成了。说服代码:
while(true)
{
bool continue_flag = false;
switch(var)
{
default:
if(something)
continue_flag = true;
break;
// do something
OtherCases:
// do something
}
if (!contine_flag)
break;
}
完整提交:https ://github.com/FirstLoveLife/Mach7/commit/3db24a337a7643018ed9e12ac95f53f9a036251c
这是一个相关的 QA:在 switch 语句中使用 continue
推荐阅读
- r - 如何从ggplot2上的stat_function自动定义水平线的高度?
- jsf - JSF inputFile 拒绝在框架中显示“mypage.xhtml”,因为它将“X-Frame-Options”设置为“拒绝”
- javascript - 对于数字数组,返回某个数字出现的次数
- asp.net - 尽管 Web.config 有效,但 IIS 给出 0x8007000d“格式错误的 XML”
- jupyter-lab - 从 JupyterLab 中的 jupyter_notebook_config.py 设置 --no-browser
- javascript - 强大的拨动开关,如何点击标签?
- c# - 让游戏对象以给定的速度转动并在圆圈上移动
- asp.net-core - 有没有办法在断路器打开时存储请求?
- c - 使用 -fprofile-instr-generate 的 Clang 覆盖映射
- c# - 如何在插入 RichEditBox 的图像中显示调整大小的装饰器?