- 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!!!";
}
}
Из тела одного большого класса, я конечно понимаю что строки хранятся не в стеке, но всеравно.
errors[0] = "!!!unknown error!!!" - не, никак?
Меня больше смущает то, что литерал это const char *, а возвращаемый тип - char *. Вот на это компилятор точно выругается.
error же не локальная переменная, строки тоже.
Если вам этот код не очевиден - идите прочитайте стандарт с++, и прекратите писать хуйню.
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 * - это и правда говно, и очень-очень плохо.
*ошибка компиляции, а не компилятора, чтобы понятнее было
К сожалению. Для совместимости с говном мамонтов, которую, к сожалению, нельзя потерять ;(
будет, например
warning: deprecated conversion from string constant to 'char*'
И что будет если поменять символ? Все следующие возвраты будут возвращать изменённую строку?
И зачем это было нужно в сишке? В те времена что, указателей на константы не было?
Про визуалку пусть ответит defecate-plusplus, в gcc -Wwrite-strings включено по дефолту, даже без -Wall.
> И что будет если поменять символ?
UB. В некоторых случаях краш, в некоторых литерал действительно изменится.
> И зачем это было нужно в сишке?
const'ов не было
мой ответ тебе не понравится
студия слишком горда, чтобы париться о такой никчемной проблеме даже на /W4
ответ лежит на поверхности - программисты под Microsoft Windows пишут начисто практически совершенный код, а красноглазые изобретатели велосипедов продолжают страдать байтоебством, экономя std::string, тем самым постоянно наступают на все возможные грабли - потому их медленному компилятору приходится проверять вообще все возможные ошибки, подтирая какашки за начинающими любителями
впрочем, последних тоже можно понять - пока эклипс отобразит введенные лишние 6 символов const, можно сходить за дошираком, а когда нет разницы, зачем писать больше
Что правда, то правда.
P.S. Был бы гугл мой...ну вы меня понели.
http://govnokod.ru/11736#comment153327
Для особо тупых и не знающих инглиш переведу:
Литерал имеет точно такое же время жизни, как любая другая статик переменная. Литерал имеет тип const char [n].
@guest, в гцц под линухом литералы походу уходят в .text, см. выше мой комментарий о краше после попытки поправить что-нибудь в литерале. Недостаток текущего кода - в возврате char * вместо const char *.
А на будущее - прежде чем написать сомнительное предположение, почитайте, пожалуйста, стандарт или задайте вопрос гуглу. Не стоит лишний раз вводить людей в заблуждение, они же и поверить могут. А с++ и без того сложный язык, в котором и через 5-10 лет работы встречаются новые тонкости.