- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
char* GetConnectionName(){return "";}
//---
char* NetworkMgr::getErrorString(int id)
{
if(this->idValid(id))
{
return errors[id];
}
else
{
return "!!!unknown error!!!";
}
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+18
char* GetConnectionName(){return "";}
//---
char* NetworkMgr::getErrorString(int id)
{
if(this->idValid(id))
{
return errors[id];
}
else
{
return "!!!unknown error!!!";
}
}
Из тела одного большого класса, я конечно понимаю что строки хранятся не в стеке, но всеравно.
sayidandrtfm 10.09.2012 12:06 # 0
errors[0] = "!!!unknown error!!!" - не, никак?
Psionic 10.09.2012 12:09 # −2
sayidandrtfm 10.09.2012 12:13 # 0
Psionic 10.09.2012 12:19 # 0
guest 11.09.2012 09:03 # 0
TarasB 10.09.2012 12:11 # +1
Psionic 10.09.2012 12:20 # −1
sayidandrtfm 10.09.2012 12:23 # +1
bormand 10.09.2012 12:25 # +2
Меня больше смущает то, что литерал это const char *, а возвращаемый тип - char *. Вот на это компилятор точно выругается.
Psionic 10.09.2012 12:39 # −2
bormand 10.09.2012 12:56 # 0
error же не локальная переменная, строки тоже.
Psionic 10.09.2012 16:23 # −2
TarasB 10.09.2012 16:29 # +2
bormand 10.09.2012 16:31 # +3
Если вам этот код не очевиден - идите прочитайте стандарт с++, и прекратите писать хуйню.
C++ 98, 2.13.4 пункт 1.
An ordinary string literal has type “array of n const char” and static storage duration (3.7), where n is the size of the string as defined below, and is initialized with the given characters.
P.S. А вот то, что функция возвращает char * вместо const char * - это и правда говно, и очень-очень плохо.
TarasB 10.09.2012 16:36 # +3
*ошибка компиляции, а не компилятора, чтобы понятнее было
bormand 10.09.2012 16:40 # +1
К сожалению. Для совместимости с говном мамонтов, которую, к сожалению, нельзя потерять ;(
defecate-plusplus 10.09.2012 16:42 # +2
будет, например
warning: deprecated conversion from string constant to 'char*'
TarasB 10.09.2012 16:48 # +1
И что будет если поменять символ? Все следующие возвраты будут возвращать изменённую строку?
И зачем это было нужно в сишке? В те времена что, указателей на константы не было?
bormand 10.09.2012 16:50 # +1
Про визуалку пусть ответит defecate-plusplus, в gcc -Wwrite-strings включено по дефолту, даже без -Wall.
> И что будет если поменять символ?
UB. В некоторых случаях краш, в некоторых литерал действительно изменится.
> И зачем это было нужно в сишке?
const'ов не было
bormand 10.09.2012 16:55 # +1
defecate-plusplus 10.09.2012 16:52 # +1
мой ответ тебе не понравится
студия слишком горда, чтобы париться о такой никчемной проблеме даже на /W4
defecate-plusplus 10.09.2012 17:05 # +6
ответ лежит на поверхности - программисты под Microsoft Windows пишут начисто практически совершенный код, а красноглазые изобретатели велосипедов продолжают страдать байтоебством, экономя std::string, тем самым постоянно наступают на все возможные грабли - потому их медленному компилятору приходится проверять вообще все возможные ошибки, подтирая какашки за начинающими любителями
впрочем, последних тоже можно понять - пока эклипс отобразит введенные лишние 6 символов const, можно сходить за дошираком, а когда нет разницы, зачем писать больше
bormand 10.09.2012 17:09 # 0
Что правда, то правда.
TarasB 11.09.2012 15:54 # 0
roman-kashitsyn 12.09.2012 13:54 # +3
3.14159265 12.09.2012 14:06 # +2
TarasB 10.09.2012 13:38 # +1
sayidandrtfm 10.09.2012 12:21 # +1
vistefan 10.09.2012 15:47 # +3
sayidandrtfm 12.09.2012 07:59 # 0
P.S. Был бы гугл мой...ну вы меня понели.
guest 11.09.2012 14:24 # 0
guest 11.09.2012 14:25 # 0
Psionic 11.09.2012 15:19 # −2
bormand 11.09.2012 15:50 # +4
http://govnokod.ru/11736#comment153327
Для особо тупых и не знающих инглиш переведу:
Литерал имеет точно такое же время жизни, как любая другая статик переменная. Литерал имеет тип const char [n].
@guest, в гцц под линухом литералы походу уходят в .text, см. выше мой комментарий о краше после попытки поправить что-нибудь в литерале. Недостаток текущего кода - в возврате char * вместо const char *.
Psionic 11.09.2012 15:54 # −1
bormand 11.09.2012 15:59 # +5
А на будущее - прежде чем написать сомнительное предположение, почитайте, пожалуйста, стандарт или задайте вопрос гуглу. Не стоит лишний раз вводить людей в заблуждение, они же и поверить могут. А с++ и без того сложный язык, в котором и через 5-10 лет работы встречаются новые тонкости.