2008-09-14 7 views
8

У меня есть функция, которая дает мне следующее предупреждение:Как отключить предупреждение в Delphi о «возвращаемом значении ... может быть undefined»?

[DCC Warning] filename.pas (6939): W1035 возвращаемое значение 'функции' функции может быть неопределенными

Функции, однако, является чистым, небольшим и имеет известное, ожидаемое, возвращаемое значение. Первое утверждение в функции:

Result := ''; 

и не локальная переменная или параметр называется Result либо.

Есть ли какая-нибудь прагма-подобная директива, которую я могу окружить этим методом, чтобы удалить это предупреждение? Это Delphi 2007.

К сожалению, эта справочная система на этой установке Delphi не работает, поэтому я не могу всплывать помощь для этого предупреждения прямо сейчас.

Кто-нибудь знает верхнюю часть головы, что я могу сделать?

+0

@NGLN В связанном дубликате код определенно не задает `Result`, а предупреждение компилятора в этом случае может быть связано с тем, что компилятор не видит, что` Abort` завершит этот метод, не допуская его правильного возврата. Однако в моем вопросе код определенно задал `Result`, поскольку это был буквально первый оператор метода. Вы уверены, что это хороший дубликат? – 2014-11-19 20:06:04

+0

O стрелять, я владел молотом [dupe hammer] (http://meta.stackexchange.com/questions/231625/please-remind-me-when-i-am-wielding-the-dupe-hammer); это не было моим намерением. Я вижу разницу сейчас, но я думаю, что заголовок должен был быть чем-то вроде: Почему это возвращаемое значение не определено (и как его решить)? _. Но если это не дубликат, я все еще не уверен, что этот вопрос не должен закрываться, потому что он звучит как _Too Localized_. Я буду голосовать за повторное открытие, так как либо не был отмечен как обман, когда был отправлен [этот ответ] (http://stackoverflow.com/a/4204619/757830) и оставил его сообществу. – NGLN 2014-11-19 21:44:50

ответ

6

Вы уверены, что вы сделали все, чтобы решить это предупреждение? Может быть, вы могли бы опубликовать код для нас, чтобы посмотреть?

Вы можете отключить предупреждение локально таким образом:

{$WARN NO_RETVAL OFF} 
function func(...): string; 
begin 
    ... 
end; 
{$WARN NO_RETVAL ON} 
+0

Первый оператор в функции дает функции возвращаемое по умолчанию значение. Остальная часть функции - это один оператор case и некоторые вызовы других функций из точек случая. – 2008-09-14 15:55:53

1

Кажется, что-то вроде ошибки в Delphi. Прочитайте этот пост, последний комментарий ссылка на другие отчеты об ошибках, которые могут быть один, что у вас есть:

http://qc.codegear.com/wc/qcmain.aspx?d=8144

+0

Я знаю, есть также аналогичный отчет об ошибках о том, что слишком много локальных переменных и параметров в совокупности вызывает это, но эта функция очень проста. В любом случае, Delphi не работает. Что еще нового :) – 2008-09-14 15:58:41

1

{$ WARN NO_RETVAL OFF} является то, что вы ищете, но в целом я хотел бы узнать, почему такие вещи, как это происходит. Вы можете рассмотреть возможность форматирования по-разному и увидеть, помогает ли это.

Есть ли у вас команды изменения потока, такие как Exit? Вы напрямую делаете исключения и т. Д.? У вашего оператора case есть еще что-нибудь в конце, которое устанавливает значение в Result?

Можете попробовать настроить эти элементы и посмотреть, не устраняет ли это предупреждение.

1

Чтобы получить хороший ответ для этого, вам нужно будет отправить код. В общем, компилятор Delphi предоставит это предупреждение, если существует возможный путь кода, который может привести к тому, что результат не будет определен. Иногда этот путь кода меньше, чем очевидно.

+1

Когда путь кода следует за исходной безусловной строкой кода, которая явно инициализирует «результат» (как объясняется в вопросе), то независимо от того, насколько неочевидно, что путь кода является предупреждением, является фиктивным (в данном случае). – Deltics 2009-11-11 22:01:17

3

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

1

Существует такая ошибка в компиляторе Delphi, поскольку, по крайней мере, Delphi4: если сумма чисел параметров функции (включая Self и Result) и локальных переменных превышает 31, это вызывает проблемы. Например, он может записывать предупреждения W1035 (результат может быть неопределенным). Он может пропустить неиспользуемые переменные. Просто попробуйте этот проект:

program TestCompilerProblems; 

procedure Proc; 
var 
    a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, 
    a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, 
    a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, 
    a31, a32, a33, a34, a35, a36, a37, a38, a39, a40: Integer; 
begin 
end; 

begin 
    Proc; 
end. 

Это вызовет 31 намек, а не 40.