Пропуск инициализации wstring из-за goto

191
04 сентября 2018, 23:30
if(blablabla) goto mmClean;
const size_t cSize2 = strlen(...);
std::wstring wc2(cSize2, L'#');
mmClean:
...

компилятор выкидывает ошибку что не может инициализировать wc2 из-за метки mmClean. Да, знаю что goto использовать не стоит, но в моем случае он используется крайне редко когда для "правильного кода" нужно переписывать достаточно много. В любом случае, как можно обозначить wc2 чтобы не выдавало ошибку? Может определить динамически? cSize2 может быть каким угодно в процессе

Answer 1
if (blablabla) goto mmClean;
{
    const size_t cSize2 = strlen(...);
    std::wstring wc2(cSize2, L'#');
}
mmClean:

Все объявления переменных следует ограничить операторными скобками, ограничивая тем самым их время жизни. Причину попытаюсь объяснить на примере: выполняется программа допустим, что выражение blablabla истинно, тогда goto пропустит объявление и инициализация cSize2 и wc2. Но никто вам не мешает после mmClean использовать эти переменные, никто кроме компилятора, который любезно останавливает вас от неправильных действий. Решение - ограничить жизнь переменных cSize2 и wc2: этим вы сообщите компилятору, что после метки goto вы не собираетесь использовать эти переменные (а если собираетесь - значит у вас неправильный дизайн функции)

READ ALSO
Помогите решить ошибку с interface android

Помогите решить ошибку с interface android

У меня есть приложение в котором я пытаюсь реализовать функцию логина при помощи логина и пароля, и вот у меня возникла ошибка

232
Java. Spring. Многопользовательский режим

Java. Spring. Многопользовательский режим

Подскажите, что прочитать, чтоб понять как Spring работает в многопользовательском режиме?

208
Сравнить переменные в объектах JAVA

Сравнить переменные в объектах JAVA

Существуют шесть объектов - кубов у которых есть объем(сторона задана в ручную)Как мне отсортировать объемы кубов и вывести информацию в табличном...

224