Почему я могу скомпилировать код с 2 возвратами?

Поскольку я пришел с острова Java, я удивляюсь, почему компилятор не предупреждает о недоступном коде в чем-то вроде:

int main(int argc, char** argV)
{

std::list<int> lst = {1,2,3,4};

return 0;std::cout << "Done!!!" << std::endl;
return 0;
}

мой вопрос:

Почему я могу скомпилировать код с 2 возвратами?

мой компилятор gcc для c ++ 11, в Windows, блок кода

1

Решение

Я задаюсь вопросом, почему компилятор не предупреждает о недоступном коде в чем-то вроде

Это довольно хорошо объяснено в GCC documentaion о предупреждениях:

-Wunreachable-код

Предупреждать, если компилятор обнаружит, что код никогда не будет выполнен. Эта опция предназначена для предупреждения, когда компилятор обнаруживает
что по крайней мере целая строка исходного кода никогда не будет выполнена,
потому что какое-то условие никогда не выполняется или потому что это после
процедура, которая никогда не возвращается.

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

Например, когда функция встроена, предупреждение может означать, что
строка недоступна только в одной встроенной копии функции.

Эта опция не является частью -Wall, потому что в отладочной версии
программы часто есть существенный код, который проверяет правильность
функционирование программы и, мы надеемся, недоступны, потому что
Программа работает. Другое распространенное использование недоступного кода — это
обеспечить поведение, которое можно выбрать во время компиляции.

Хотя g ++ 5.1.0 не выдает никаких предупреждений для этого кода, даже если эта опция включена.

5

Другие решения

Почему вы не должны быть в состоянии скомпилировать код, который имеет несколько возвращений?
Потому что код недоступен? Большинство компиляторов могут выдать предупреждение за это.

Тем не менее, я часто вижу такой код:

   if(a)
{
// Do stuff
}
else
{
// Do other stuff

if(b)
{
// Do more stuff
}
else
{
// Do other more stuff
}
}

Это можно упростить как

   if(a)
{
// Do stuff
return;
}

// Do other stuff

if(b)
{
// Do more stuff
return;
}

// Do other more stuff

Около десяти лет назад люди нахмурились, что в методе было несколько возвращений, но на самом деле нет оснований продолжать хмуриться с помощью современных компиляторов.

1

Потому что эта часть

std::cout << "Done!!!" << std::endl;
return 0;

никогда не будет вызван из-за первого return оператора, но это не ошибка при прерывании компиляции, скорее, компилятор может выдать предупреждение в зависимости от того, какой компилятор вы используете (например, об этом предупреждает компилятор Microsoft VC ++).

0

Недоступный код не является ошибкой компиляции в C ++, но обычно выдает предупреждение, в зависимости от вашего компилятора и флагов.

Вы можете попробовать добавить опцию -Wall при вызове вашего компилятора. Это будет
Активно много полезных предупреждений.

0

Главным образом потому, что чаще всего компилятор не может знать наверняка. (Были попытки сделать это в Java, но были критерии для определения достижимость было решено.)

В этом случае, действительно, это очевидно.

Некоторые компиляторы выдают предупреждения о достижимости, но стандарт C ++ этого не требует.

Ни один ответ о достижимости не будет полным без ссылки на это: https://en.wikipedia.org/wiki/Halting_problem

В качестве последнего замечания по Java рассмотрим следующие два фрагмента Java:

if (true){
return;
}
; // this statement is defined to be reachable

а также

while (true){
return;
}
; // this statement is defined to be unreachable

На мой взгляд, худшее из двух миров достигнуто.

0

Для этого есть две причины:

  1. C ++ имеет много стандартов (c ++ 11, c ++ 14, c ++ 17 и т. Д.), В отличие от java (в стандарте java очень жесток, и единственной вещью, которая действительно имеет значение для java, является используемая вами версия), поэтому некоторые компиляторы могут предупредить вас о недоступном коде, а другие — нет.

  2. Заявления после return 0, хотя они и не доступны по логике, не вызывают фатальных ошибок, таких как неоднозначность, синтаксическая ошибка и т. д., и могут быть легко скомпилированы (если компилятор пожелает;)).

0
По вопросам рекламы [email protected]