2015-10-14 6 views
1

Как я могу указать указатель константы по умолчанию в параметре функции? nil работает, но обычный указатель этого не делает.Как передать указатель const на функцию?

program Project1; 

type 
    TFoo = function(const A, B): Integer; 

function FooA(const A, B): Integer; inline; 
begin 
    WriteLn('FooA'); 
end; 

function FooB(const A, B): Integer; inline; 
begin 
    WriteLn('FooB'); 
end; 

procedure Something(const Foo: TFoo = @FooA); // Constant expression expected 
begin 

end; 

begin 
    Something(FooB); 
end. 

ответ

2

Вы не можете этого сделать. Вы можете сделать это с перегруженными методами передать значение по умолчанию: параметры

procedure Something(const Foo: TFoo); overload; 
begin 

end; 

procedure Something; overload; 
begin 
    Something(FooA); 
end; 
5

по умолчанию вычисляется компилятором. Таким образом, они должны быть постоянными выражениями. И адрес функции не известен во время компиляции и, следовательно, не является постоянным выражением. Отсюда сообщение об ошибке.

Полезно понять, как компилятор реализует параметры по умолчанию. Предположим, у вас есть функция, как это:

procedure foo(bar: Integer = 666); 

Теперь предположим, что в какой-то другой точке программы вы вызываете эту функцию и опустить параметр, например:

foo(); 

Компилятор преобразует этот вызов заменяя по умолчанию параметры:

foo(666); 

а затем компилирует это. Поскольку единицы компилируются целиком, следует, что параметры по умолчанию должны быть постоянными выражениями.

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

procedure Something(const Foo: TFoo); overload; 
begin 
    // do something with Foo 
end; 

procedure Something(); overload; inline; 
begin 
    Something(FooA); 
end; 

Использование инлайн заставляет компилятор переводить

Something(); 

в

Something(FooA); 

это именно то, что вы пытаетесь достичь с помощью параметра по умолчанию.

+0

Уверены ли вы? Это возможно в C++. http://paste.ie/view/a2cc6224 – user15124

+0

Вы спрашиваете о Delphi или C++? –

+0

Про Delphi, очевидно. Но это должно работать так же, как в C++. Увы, это не так. – user15124

Смежные вопросы