Есть ли проблема при переходе в блок if (false)? - PullRequest
5 голосов
/ 30 октября 2019

Я уже пару раз читал (например, здесь Компилятор: что если условие всегда истинно / ложно ), что любой приличный компилятор c ++ откажется от чего-то вроде

if(false)
{
 ...
}

Но что, если в этот блок if(false) произойдет преднамеренный переход? Я имею в виду что-то вроде этого

#include <iostream>

void func(int part){
    switch (part) {
    case 0:{
        if(false)
            case 1:{std::cout << "hello" << std::endl;}
        break;
    }
    default:
        break;
    }
}

int main()
{
    func(0);
    func(1);
    return 0;
}

Соблюдает ли приличный компилятор c ++ этот скачок, или в конечном итоге возникнут проблемы с отказом?

1 Ответ

8 голосов
/ 30 октября 2019

Код не является неопределенным поведением. Поэтому любая оптимизация не может привести к каким-либо эффектам, которые могли бы повлиять на поведение кода.

Примечание: В связи с этим видом кода одна вещь, которую вы не можете делать, это "Перейти к определению локальных переменных. Но этот код не делает этого, так что нет проблем.

Еще одно замечание: если у вас есть такой код в «реальной» (не игрушке, эксперименте, запутывании и т. Д.) Программе, вы должны действительно провести рефакторингэто во что-то, что не вызывает так много WTF от любого, кто читает код.

...