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;
}
}
гцц ругается, мол, не всегда вернется чо.

1. nanonymous 16.06.2011 16:53 Psi+

default?

2. 0xd34df00dnanonymous /1 16.06.2011 16:53 Azoth_primary

Но зачем?

3. 0x22070xd34df00d /2 16.06.2011 17:04 epsilon

а вдруг ты решишь потом еще добавить что-нибудь в энум?

5. 0x2207 16.06.2011 17:05 epsilon

у gcc это вообще стандартный прикол:
fun(){
if( .. ){
return 0;
}else{
return 1;
}
}

6. 0x22070x2207 /5 16.06.2011 17:05 epsilon

будет ругаться на это

8. 0xd34df00d0x2207 /3 16.06.2011 17:05 Azoth_primary

Я не говорю о сферической правильности дизайна этой функции, я спрашиваю, почему гцц мне говорит, что no return in non-void function, хотя все control flow что-нибудь вернут.

9. magog0xd34df00d /8 16.06.2011 17:06 Psi+

потому что он не разбирает циклы по возврату. Ты должен сделать явный возврат. Я эту проблему уже как-то поднимал

10. 0xd34df00d0x2207 /6 16.06.2011 17:06 Azoth_primary

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

11. 0xd34df00daspotashev /7 16.06.2011 17:07 Azoth_primary

Так, что в enum ручками задано три значения, и декларация енума ему видна. UB из /10 не рассматриваем, это совсем другой вопрос.

12. 0xd34df00dmagog /9 16.06.2011 17:07 Azoth_primary

> разбирает циклы по возврату
ШТО

14. magog0xd34df00d /12 16.06.2011 17:08 Psi+

ну, он будет ругаться даже на ситуацию в /5, потому что функция явно ничего не возвращает.

15. 0xd34df00daspotashev /13 16.06.2011 17:09 Azoth_primary

Явно кастуя, и это явно UB — то есть, в этом случае ты ССЗБ.

16. 0xd34df00dmagog /14 16.06.2011 17:09 Azoth_primary

gcc тупой, так и запишем.

17. magog0xd34df00d /16 16.06.2011 17:09 Psi+

ну, не столько тупой, сколько более требователен к условиям

19. 0x2207magog /14 16.06.2011 17:10 epsilon

мне обычно ничего не мешает переписать это как
function(){
if(..){
return 1;
}
return 0;
}

20. magog0x2207 /19 16.06.2011 17:10 Psi+

по-моему это единственный вариант =)

21. 0xd34df00daspotashev /18 16.06.2011 17:12 Azoth_primary

Что еще кастовать? Тебе уже енам приходит.

22. 0xd34df00d0x2207 /19 16.06.2011 17:12 Azoth_primary

Костыли какие-то.

24. 0xd34df00daspotashev /23 16.06.2011 17:13 Azoth_primary

Обязательно явно каствоать.

26. ulidtko 16.06.2011 17:47 lunatic asylum

мб такой-то анализ control flow-а включается каким-нибудь не включенным по умолчанию флагом gcc.

27. cirno 16.06.2011 17:50 c6d0d3ce

В сишечке enum идет как iota, то есть членам присваиваются числа 0, 1, 2, etc

28. 0xd34df00dcirno /27 16.06.2011 17:51 Azoth_primary

Но я-то собираю плюсокомпилятором!
Олсо, там что, нельзя написать enum { Shit = 10, Fuck = 20, Suck = 25 };?

29. ulidtkocirno /27 16.06.2011 17:51 lunatic asylum

речь о плюсах, там енумы уже полноценные типы.

30. 0xd34df00dulidtko /29 16.06.2011 17:51 Azoth_primary

Охуенно полноценные.

31. cirno0xd34df00d /28 16.06.2011 17:51 c6d0d3ce

Ну я же плюсофоб, в вашем огороде не разбираюсь. Тогда да, соснулей видимо.

32. ulidtko0xd34df00d /30 16.06.2011 17:51 lunatic asylum

по-плюсовому полноценные :cf:

33. cirno0xd34df00d /28 16.06.2011 17:52 c6d0d3ce

Вроде можно, обычно не пользуюсь этим.

34. ulidtko 16.06.2011 18:03 lunatic asylum

олсо, задай вопрос на stackoverflow, потому что здесь все некомпетентные школьники, как видно.

35. 0xd34df00dulidtko /34 16.06.2011 18:03 Azoth_primary

Меня там нет.

36. ulidtko0xd34df00d /35 16.06.2011 18:04 lunatic asylum

тогда я задам.

37. ulidtko0xd34df00d /35 16.06.2011 18:04 lunatic asylum

(хотя вопросы можно и анонимно задавать, то есть гостем)

Do you really want to delete ?