Компилятор предупреждает, что элемент управления может достигать конца вашей функции, не являющейся пустым, потому что элемент управления может достигать конца вашей функции, не являющейся пустым.
Чтобы предотвратить это, вы должны выполнить одно из:
- Отключить предупреждение компилятора.(С Clang это делает опция командной строки
-Wno-return-type
.) (В C разрешено, чтобы не пустая функция могла вытекать из конца функции без возврата значения, при условии, что вызывающая сторона не пытается использоватьвозвращаемое значение.) - Укажите компилятору, что функция возвращает.
Существует два пути, в которых компилятору не ясно, что функция возвращает.
Сначала рассмотрим:
if (string_length(s) <= 1)
…
else if (string_length(s) > 1)
Математически мы знаем, что либо x ≤ 1, либо x > 1, поэтому “ x ≤ 1 или x > 1 ”верно.Однако компилятор не знает, что первый вызов string_length(s)
возвращает то же значение, что и второй вызов.Поэтому он не может знать, что хотя бы одно из этих условий является верным.Он должен предполагать, что они оба могут быть ложными, и тогда управление будет передаваться в конец функции без оператора return
.
Некоторые компиляторы имеют функцию, позволяющую объявить функцию равной pure , который сообщит компилятору, что он возвращает то же значение при том же входе, а также не изменяет состояние программы другими способами.Если вы использовали эту функцию, или компилятор мог видеть определение string_length
, он мог бы обнаружить, что одно из двух условий истинно.Однако более простой способ исправить это - просто изменить else if (string_length(s) > 1)
на else
.Тогда компилятор знает , что, если предложение if
не выполнено, предложение else
должно быть.
Во-вторых, рассмотрим:
for (int i=0; i<string_length(s);i++)
{
if( (string_charat(s,i)==first_letter) && (i!=0))
{
return string_sub(s, 0,i);
}
}
Этот циклможет закончиться без срабатывания if
.В s
может отсутствовать символ, равный первому символу, поэтому return
никогда не выполняется.Затем цикл завершается, и управление переходит к концу функции без оператора return
.
Чтобы предотвратить это, вы можете вставить оператор return
после цикла for
.Он вернет любое значение, которое вы хотите вернуть, если совпадение не найдено.