2016-09-06 6 views
-2

После почти часа отладки я наконец обнаружил точку с запятой после одного оператора return. Вот упрощенная версияНедостижимый код, но без предупреждения

void PrintNumber(int value) { 
    cout << value << endl; 
} 

void BuggyFunction(int value) 
{ 
    if (value == 0) 
     return 

    PrintNumber(value); 
} 

Да, PrintNumber никогда не будет вызван. Но компилятор (VS 2015) молчал. Есть ли причина такого поведения?

+2

Ну, PrintNumber будет вызываться, если значение равно нулю. Я думаю, что визуальная студия анализирует только текущий метод, вам понадобится весь анализ программы, чтобы понять это. – tobspr

+1

Хорошая логическая ошибка (действительный код, однако) –

+3

Вы сохраните этот час в будущем, если вы используете квадратные скобки в каждом выражении if , –

ответ

4

Ну, технически ваша функция (из-за недостающую точку с запятой) интерпретируется следующим образом:

void BuggyFunction(int value) { 
    if (value == 0) { 
     return PrintNumber(value); 
    } 
} 

PrintNumber С имеет также void как тип возвращаемого значения, это утверждение совершенно синтаксический правовое, хотя это не очевидно, имеет смысл.

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

+1

Или избегать ранних возвратов:' if (value! = 0) {PrintNumber (value);} скорее выразит намерение в этом простом случае. –

+3

GCC 6 имеет предупреждение '-Wmisleading-indentation' :) –

2

Ваш код эквивалентен:

void BuggyFunction(int value) 
{ 
    if (value == 0) 
    { 
     return PrintNumber(value); 
    } 
} 

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

Если ваш компилятор сгенерировал предупреждение «недостижимый код», это было бы ошибкой, так как весь написанный вами код доступен.