LINUX.ORG.RU

Как объяснить GCC, что switch полный?

 , ,


0

4

Имеем:

enum class MyEnum
{
   One,
   Two,
}

QString myfunc(const MyEnum e)
{
    switch (e) {
        case MyEnum:One : return "One";
        case MyEnum:Two : return "Two";
    }
}
* код не запускал

GCC 5.4.0 с радостью вещает мне, что:

warning: control reaches end of non-void function [-Wreturn-type]

При том, что clang обрабатывает верно.

Как убрать этот варнинг без глобального флага и без #pragma GCC diagnostic ignored "-Wreturn-type"?

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 2)
Ответ на: комментарий от Deleted
enum MyEnum
{
   One,
   Two,
   None,
};

const char * myfunc(const MyEnum e)
{
    switch (e)
    {
        case One : return "One";
        case Two : return "Two";
        default  : return "None";
    }
}

int main(int argc, char *argv[])
{
    myfunc(One);
    myfunc(Two);
    return 0;
}
Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Не упустишь любое значение вне диапазона MyEnum вызовет ошибку уже на этапе компиляции (только цпп) до дефолта там не дойдёт, это просто красивая заглушка, но можно и abort() если хочется, что хочешь короче вставляй, это формальность для компилятора что бы он точно знал что в случае чего по контексту исполнения гарантированно будет возврат

Deleted
()
Ответ на: комментарий от Deleted

Не упустишь любое значение вне диапазона MyEnum вызовет ошибку уже на этапе компиляции (только цпп)

Нет.

Deleted
()
Ответ на: комментарий от Deleted

Ну если нет, то делать как ты сказал или исключение вешать. Но ты задай любое значение например 42 да глянь. Если там что от версий зависит то я не в курсе cpp не знаю.

Нет.

Я скоро буду матом всех ругать за информативные ответы :D

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Как называется эта болезнь, когда вместо очевидной компайл-тайм проверки пихают рантайм проверку?

anonymous
()
QString myfunc( MyEnum e )
{
	assert( (int)e == (int)MyEnum::One || (int)e == (int)MyEnum::Two );
	return ( e == MyEnum::One ) ? "One" : "Two";
}
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.