【发布时间】:2019-07-20 17:08:40
【问题描述】:
我正在尝试删除 Mach7 中的 goto 语句,因为 goto is not allowed in constexpr function:
#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 替换成别的东西?
【问题讨论】:
-
可能包含从 XTL_CONCAT(ReMatch,LINE) 开始的行:一直到带有“while(true){”的 switch 右括号的末尾,并且那么用“break/continue”替换“goto”语句是一个解决方案吗?
-
@ozlsn 在发布这个问题之前我已经尝试过了,但不知何故失败了,请让 gcc -E 深入研究它。
-
XTL_REDUNDANCY_ONLY 可能会设置另一个循环“继续”;会循环通过。我们必须看到所有的宏。
-
你为什么要用这么复杂的宏?你不能改用常规函数吗?
-
@JVApen 我不是这个模式匹配库的作者。所以在对这个库足够熟悉之前,我无法回答这个问题