【问题标题】:replace goto inside a macro with something else用其他东西替换宏内的 goto
【发布时间】: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 我不是这个模式匹配库的作者。所以在对这个库足够熟悉之前,我无法回答这个问题

标签: c++ macros constexpr goto


【解决方案1】:

在@ozlsn 和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:Using continue in a switch statement

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2018-10-28
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多