заменить goto внутри макроса чем-то другим

Я пытаюсь удалить оператор goto внутри Mach7, потому что goto не допускается в функции constexpr:

#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 на что-то другое?


person 陳 力    schedule 27.02.2019    source источник
comment
Возможно включение строк, начинающихся с XTL_CONCAT (ReMatch, LINE): до конца закрывающей скобки переключателя с помощью while (true) {, а затем замена операторов goto на break / continue будет решение?   -  person ozlsn    schedule 27.02.2019
comment
@ozlsn Я пробовал это перед тем, как опубликовать этот вопрос, но почему-то не удалось, дайте мне gcc -E покопаться в этом.   -  person 陳 力    schedule 27.02.2019
comment
XTL_REDUNDANCY_ONLY может установить другой цикл, который продолжается; будет циклически проходить. Нам нужно увидеть все макросы.   -  person Garr Godfrey    schedule 27.02.2019
comment
Почему вы используете такие сложные макросы? Разве вы не можете вместо этого использовать обычные функции?   -  person JVApen    schedule 27.02.2019
comment
@JVApen Я не являюсь автором этой библиотеки сопоставления с образцом. Поэтому я не могу ответить на этот вопрос, пока не ознакомлюсь с этой библиотекой.   -  person 陳 力    schedule 27.02.2019


Ответы (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/3a712a03a03a03a03a06aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa68a >

Вот связанный с этим QA: Использование continue в операторе переключения

person 陳 力    schedule 27.02.2019