【问题标题】:FPC 3.0 and InterlockedCompareExchangeFPC 3.0 和 InterlockedCompareExchange
【发布时间】:2016-04-05 05:14:45
【问题描述】:

我在 Windows 10(64 位)上安装了 Lazarus 1.6/FPC 3.0,64 位,并移植了包含 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) 错误:arg no 的类型不兼容。 3:得到 “指针”,应为“LongInt”

显然“过载”不起作用。如何解决?

我在默认(64 位)目标上使用 64 位 FPC 3.0。

【问题讨论】:

  • 尝试使用jwawinbase单元中的InterlockedCompareExchangePointer函数。或从uses 子句中删除windows 单元或调用函数为System.InterlockedCompareExchange,因为它是跨平台的。
  • 这些都应该是理想世界中的编译器内在函数

标签: delphi lazarus freepascal fpc


【解决方案1】:

以下解决方法

{$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 错误。

【讨论】:

    【解决方案2】:

    在 FPC 3.1.1 (r34599) 中添加了 InterlockedCompareExchangePointer:

    http://bugs.freepascal.org/view.php?id=29965

    【讨论】:

      猜你喜欢
      • 2012-04-03
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多