Здравствуйте, Shmj, Вы писали:
S>Вопрос такой. По умолчанию на моей системе компилятор не выдает ошибку, когда функция, которая должна возвращать bool — ничего не возвращает.
S>Как разобраться с опциями — хотелось бы такое отлавливать на этапе компиляции.
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой. По умолчанию на моей системе компилятор не выдает ошибку, когда функция, которая должна возвращать bool — ничего не возвращает.
А ты точно настоящий сварщик?
Здравствуйте, CreatorCray, Вы писали:
S>>Вопрос такой. По умолчанию на моей системе компилятор не выдает ошибку, когда функция, которая должна возвращать bool — ничего не возвращает. CC>А ты точно настоящий сварщик?
Так он же недавно в job сам признался, что притворяется.
Здравствуйте, so5team, Вы писали:
S>Так он же недавно в job сам признался, что притворяется.
на самом деле вопрос хороший. Недавно забыл вернуть значение из функции, и забил на warnings компилятора, в итоге приложение начало падать, задолбался искать причину сбоя.
правда там не bool должен был возвращаться, а QString
Здравствуйте, wl., Вы писали:
S>>Так он же недавно в job сам признался, что притворяется.
wl.>на самом деле вопрос хороший.
На самом деле вопрос сильно непростой. Т.к., емнип, один и тот же компилятор может выдавать или не выдавать подобные предупреждения в зависимости от сложности функции. Типа вот в таком виде:
int f() {
do_something();
// нет return-а.
}
выдает, а вот в таком уже нет:
int g() {
if(some_condition) {
do_something();
// нет return-а.
}
else
return -1;
}
Или другая история (которой, емнип, подвержен VC++, хотя может и не только он один):
enum class Status { Initial, Runnung, Stopped };
const char * to_str(Status status) {
switch(status) {
case Status::Initial: return"initial";
case Status::Running: return"running";
case Status::Stopped: return"stopped";
}
}
Продвинутый компилятор может понять, что внутри switch все варианты обработаны и функция возвращает результат по всем веткам. Но менее продвинутые будут ругаться и требовать переписать в каком-то таком стиле:
enum class Status { Initial, Runnung, Stopped };
const char * to_str(Status status) {
const char * result = "<unknown>";
switch(status) {
case Status::Initial: result = "initial"; break;
case Status::Running: result = "running"; break;
case Status::Stopped: result = "stopped"; break;
}
return result;
}
Здравствуйте, CreatorCray, Вы писали:
CC>Выбрасывай такой компилятор на помоечку
Не говорите что людям делать и они не будут говорить вам куда пойти
Если серьезно, то специфика части работы такая, что не мы определяем компилятор.
S>>Продвинутый компилятор может понять CC>Это не "продвинутый", это промышленный компилятор.
С точки зрения здравого смысла там как раз все OK, т.к. используется не обычный enum, а enum class и нормальные компиляторы для switch по enum class предупреждают о том, что не все варианты обработаны.
Так что не удивлюсь, если со временем и GCC до Clang-а в этом плане дотянется.
Здравствуйте, so5team, Вы писали:
S>специфика части работы такая, что не мы определяем компилятор.
Могу только пособолезновать.
И ещё предложить делать тестовые прогоны нормальным компилятором или статическим анализатором.
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой. По умолчанию на моей системе компилятор не выдает ошибку, когда функция, которая должна возвращать bool — ничего не возвращает.
Это что значит?
1. Функция bool f() должна иметь оператор return true, но его нет?
2. Нужно было написать функцию bool f(), но написали void f()?
Если 1, то это какой-то очень кривой компилятор.
Если 2, то, возможно, там какая-то шаблонная магия, и может, этот в кусок компилятор вообще не заглядывает. Нужен контекст.
Здравствуйте, CreatorCray, Вы писали:
CC>И ещё предложить делать тестовые прогоны нормальным компилятором
В отличии от вас (у которого на все единственно правильное и непогрешимое мнение) я считаю, что компилятор, который заставляет писать вот так:
enum class Status { Initial, Runnung, Stopped };
const char * to_str(Status status) {
const char * result = "<unknown>";
switch(status) {
case Status::Initial: result = "initial"; break;
case Status::Running: result = "running"; break;
case Status::Stopped: result = "stopped"; break;
}
return result;
}
Здравствуйте, so5team, Вы писали:
S>В отличии от вас (у которого на все единственно правильное и непогрешимое мнение) я считаю
Ты хоть прочитал бы на что отвечаешь, чудо!
Пойди перечитай ветку, внимательно на этот раз.
S> что компилятор, который заставляет писать вот так нормальным в 2024-ом году называть сложно.
Такой компилятор я уже предложил снести на помоечку и взять вместо него полноценный, промышленный компилятор
Наконец-то посмотрели в зеркало? Удивительно.
CC>Пойди перечитай ветку, внимательно на этот раз.
А теперь повторю уже всерьез: не говорите людям что делать, им не придется говорить куда вам пойти.
S>> что компилятор, который заставляет писать вот так нормальным в 2024-ом году называть сложно. CC>Такой компилятор я уже предложил снести на помоечку и взять вместо него полноценный, промышленный компилятор
Для кого-то таковыми являются GCC и MSVC++. И переходить на clang или еще на что-то дорогое и близкое сердцу тов.CreatorCray они не собираются.
Это данность, с которой приходится жить. И в этой данности остается писать код так, чтобы любой компилятор из "большой тройки" не ругался.
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой. По умолчанию на моей системе компилятор не выдает ошибку, когда функция, которая должна возвращать bool — ничего не возвращает.
Странно, любой нормальный компилятор даже на минималках варнингов выдаст сообщение о таком косяке. Видимо, у тебя там что-то специально подкручивал, чтобы было так.
S>Как разобраться с опциями — хотелось бы такое отлавливать на этапе компиляции.
Ну как, как — берёшь и разбираешься В зависимости от компилятора это может быть по-разному.