Как объявить процедурный тип для class ... static?
Добавлено: 01.02.2015 04:08:21
Нигде в интернетах ответа не смог найти. Или меня одного это интересует, или задачка не решается в рамках FPC. При этом в дельфи пашет как от нефиг делать.
Есть callback функции, объявленные через процедурный тип, чтобы использоваться во внешней библиотеке. Их там две штуки, но для простоты приведу одну:
Ну и как бы зашибись всё работает. Но это неаккуратненько, доктор. Потому что вспомогательная функция класса объявлена вне класса.
Мы-то на объектном языке пишем, и вызов используется в классе, так что идеологически верно было бы оформить в качестве метода и описать, естественно, как class static, чтоб вызывалась без селфов разных там.
Но в этом случае компилятор ругается:
Причём в хелпе русским английским языком сказано следующее:
Выделено мною. Тем не менее, assign to regular procedural variable не фурычит.
Есть callback функции, объявленные через процедурный тип, чтобы использоваться во внешней библиотеке. Их там две штуки, но для простоты приведу одну:
- Код: Выделить всё
type
pcre2_malloc_func = function(size:PCRE2_SIZE; p:pointer):pointer; cdecl;
function pcre2_general_context_create_16(malloc_f: pcre2_malloc_func; free_f: pcre2_free_proc; memory_data:pointer): p_pcre2_general_context; cdecl; external;
function pcre2_malloc_def(size:PCRE2_SIZE; p:pointer):pointer; cdecl;
begin
Result := getmem(size);
end;
...
fgeneral_context := pcre2_general_context_create_16(@pcre2_malloc_def, @pcre2_free_def, nil);
Ну и как бы зашибись всё работает. Но это неаккуратненько, доктор. Потому что вспомогательная функция класса объявлена вне класса.
Мы-то на объектном языке пишем, и вызов используется в классе, так что идеологически верно было бы оформить в качестве метода и описать, естественно, как class static, чтоб вызывалась без селфов разных там.
- Код: Выделить всё
class function malloc_def(size:PCRE2_SIZE; p:pointer):pointer; cdecl; static;
Но в этом случае компилятор ругается:
Error: Incompatible type for arg no. 1: Got "<class method type of function(LongWord;Pointer):^untyped of object;CDecl>", expected "<procedure variable type of function(LongWord;Pointer):^untyped;CDecl>"
Причём в хелпе русским английским языком сказано следующее:
FPC knows static class methods in classes: these are class methods that have the Static keyword at the end. These methods behave completely like regular procedures or functions. This means that:
They do not have a Self parameter. As a result, they cannot access properties or fields or regular methods.
They cannot be virtual.
They can be assigned to regular procedural variables.
Выделено мною. Тем не менее, assign to regular procedural variable не фурычит.