gpt4 book ai didi

delphi - FPC 3.0 和 InterlockedCompareExchange

转载 作者:行者123 更新时间:2023-12-01 18:02:18 36 4
gpt4 key购买 nike

我在 Windows 10(64 位)上安装了 64 位 Lazarus 1.6/FPC 3.0,并移植了包含 InterlockedCompareExchangePointer 函数的 Delphi 代码。

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 位)目标上使用 64 位 FPC 3.0。

最佳答案

以下解决方法

{$ifdef fpc}
function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer;
begin
{$ifdef cpu64}
Result:= Pointer(InterlockedCompareExchange64(int64(Target), int64(NewValue), int64(Comperand)));
{$else cpu64}
Result:= Pointer(InterlockedCompareExchange(LongInt(Target), LongInt(NewValue), LongInt(Comperand)));
{$endif cpu64}
end;
{$endif fpc}

编译并确保Delphi/FPC兼容性;看起来缺少 InterlockedCompareExchangePointer 声明是 FPC 错误,应该修复。

关于delphi - FPC 3.0 和 InterlockedCompareExchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36417627/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com