0xd34df00d
16.06.2011 16:52 Azoth_primary
Скажите, пожалуйста, почему для трехэлементного енума и функции вида типа
int GetBlah (EnumType type)
{
switch (type)
{
case t1:
return 0;
case t2:
return -1;
case t3:
return 1;
}
}
гцц ругается, мол, не всегда вернется чо.
default?
Но зачем?
а вдруг ты решишь потом еще добавить что-нибудь в энум?
у gcc это вообще стандартный прикол:
fun(){
if( .. ){
return 0;
}else{
return 1;
}
}
будет ругаться на это
Я не говорю о сферической правильности дизайна этой функции, я спрашиваю, почему гцц мне говорит, что no return in non-void function, хотя все control flow что-нибудь вернут.
потому что он не разбирает циклы по возврату. Ты должен сделать явный возврат. Я эту проблему уже как-то поднимал
Ну вот я и говорю — плохо зделоли.
Впрочем, с енумом еще можно понять — так как С++ — нихуя не типобезопасное говно, и, явно кастуя произвольный int к енуму, мы можем получить все, что угодно, этот код действительно может вернуть хуйню. Но все же.
Так, что в enum ручками задано три значения, и декларация енума ему видна. UB из /10 не рассматриваем, это совсем другой вопрос.
> разбирает циклы по возврату
ШТО
ну, он будет ругаться даже на ситуацию в /5, потому что функция явно ничего не возвращает.
Явно кастуя, и это явно UB — то есть, в этом случае ты ССЗБ.
gcc тупой, так и запишем.
ну, не столько тупой, сколько более требователен к условиям
мне обычно ничего не мешает переписать это как
function(){
if(..){
return 1;
}
return 0;
}
по-моему это единственный вариант =)
Что еще кастовать? Тебе уже енам приходит.
Костыли какие-то.
Обязательно явно каствоать.
мб такой-то анализ control flow-а включается каким-нибудь не включенным по умолчанию флагом gcc.
В сишечке enum идет как iota, то есть членам присваиваются числа 0, 1, 2, etc
Но я-то собираю плюсокомпилятором!
Олсо, там что, нельзя написать enum { Shit = 10, Fuck = 20, Suck = 25 };?
речь о плюсах, там енумы уже полноценные типы.
Охуенно полноценные.
Ну я же плюсофоб, в вашем огороде не разбираюсь. Тогда да, соснулей видимо.
по-плюсовому полноценные :cf:
Вроде можно, обычно не пользуюсь этим.
олсо, задай вопрос на stackoverflow, потому что здесь все некомпетентные школьники, как видно.
Меня там нет.
тогда я задам.
(хотя вопросы можно и анонимно задавать, то есть гостем)