用其他东西替换宏内的goto

replace goto inside a macro with something else

本文关键字:goto 替换 其他      更新时间:2023-10-16

我正在尝试在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 XTL_CONCAT(ReMatch,__LINE__);,可以跳到Switch语句的上行。

如何用其他东西替换goto?

借助@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:使用Switch语句中使用继续