Почему параметр функции по умолчанию отклоняется в Free Pascal?
Следующий код:
program Default_Issue;
function SomeFunction(var myVar : integer;
defaulted : boolean = true) : integer;
begin
writeln('Inside SomeFunction');
SomeFunction := 0
end;
var
i : integer;
begin
SomeFunction(i,true);
end.
Получает ошибку компилятора, указывающую на знак = в объявлении функции:
Default_Issue.pas (3,64) Fatal: синтаксическая ошибка, ")" ожидается, но "=" найден
Программа скомпилируется, если в строке описания функции удалено значение параметра по умолчанию:
function SomeFunction(var myVar : integer;
defaulted : boolean) : integer;
В руководстве Free Pascal он показывает параметры по умолчанию в качестве опции для параметров-значений, а синтаксис выглядит так: "var-name: type = value", поэтому я не понимаю, почему я получаю ошибку компилятора.
3 ответа
Особенности разделены по языковым режимам. Параметры по умолчанию - это функция Delphi, а некоторые из них включены только в диалектах objfpc и Delphi.
Диалект по умолчанию (FPC) совместим с Turbo Pascal, а TP не имеет параметров по умолчанию. Добавьте параметры -S2 или -Sd. (Режим FPC имеет перегрузку, которая может использоваться для имитации)
Иногда возникает путаница, потому что Lazarus по умолчанию использует режим objfpc, передавая дополнительные параметры.
Free Pascal имеет пять режимов компиляции: (FPC, OBJFPC, TP, DELPHI, MACPAS).
Режим компилятора по умолчанию - FPC. Параметры функции / процедуры по умолчанию не поддерживаются в режиме FPC. Чтобы использовать их, вы должны изменить режим компилятора на режим, который поддерживает аргументы функций / процедур по умолчанию. Это можно сделать в исходном коде или в командной строке. Параметры по умолчанию поддерживаются в режиме OBJFPC (расширенный режим Free Pascal, который предоставляет вам все функции Free Pascal), а также в режиме DELPHI (который нацелен на максимально возможную совместимость с Delphi).
Чтобы изменить режим компилятора в исходном коде, используйте директиву компилятора {$mode xxxx}:
Program UseDefaultParameters;
{$mode OBJFPC}
Люди, которые написали Lazarus IDE, должны думать, что это должен быть режим по умолчанию, поскольку они автоматически добавляют этот режим компиляции исходного кода всякий раз, когда вы просите его создать новый (модуль, приложение, программа, консольное приложение, библиотека, программа InstantFPC, консоль FPCUnit Тестовое приложение, файл FCPUnit Test Application). Единственный раз, когда Lazarus IDE создает файл, для которого не установлен режим компилятора OBJFPC, - это когда создается новая простая программа.
Чтобы изменить режим компилятора в командной строке, используйте переключатель режима компилятора -M:
fpc -Mobjfpc my_program.pas
Как я вижу, ваша проблема в объявлении функции, неожиданная скобка после integer
:
неправильно:
function SomeFunction(var myVar : integer; defaulted : boolean = true) : integer )
право:
function SomeFunction(var myVar : integer; defaulted : boolean = true) : integer;