Я установил Lazarus 1.6/FPC 3.0, 64 бит на Windows 10 (64 бит) и портировал код Delphi, содержащий функцию InterlockedCompareExchangePointer
.FPC 3.0 и InterlockedCompareExchange
FPC 3.0 не включает объявление InterlockedCompareExchangePointer
; вместо этого она «перегруженные» InterlockedCompareExchange
, как можно увидеть в systemh.inc
:
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$ifdef cpu64}
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64';
{$else cpu64}
function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
{$endif cpu64}
Теперь я пытаюсь использовать InterlockedCompareExchange
с указателями:
program Project1;
uses Windows;
function Test: Boolean;
var
P1, P2: Pointer;
begin
Result:= InterlockedCompareExchange(P1, P2, nil) <> nil
end;
begin
Test;
end.
и не компилировать с сообщением
project1.lpr(10,50) Error: Incompatible type for arg no. 3: Got "Pointer", expected "LongInt"
поэтому, очевидно, «перегрузка» не работает. Как это исправить?
Я использую 64-разрядный FPC 3.0 по умолчанию (64-разрядная) цель.
Попытка использовать функцию '' InterlockedCompareExchangePointer' из jwawinbase' блока. Или удалите блок 'windows' из' uses' или вызовите функцию как 'System.InterlockedCompareExchange', потому что это кроссплатформенность. – Abelisto
Все они должны быть встроенными в компилятор в идеальном мире. –