【问题标题】:C function pointer translation into Delphi/Pascal?C函数指针翻译成Delphi/Pascal?
【发布时间】:2023-04-05 08:10:01
【问题描述】:

我目前正在将一些 C 标头转换为 Delphi。我找不到将函数指针从 C 转换为 Delphi 的参考。

typedef _JAlloc JAlloc;  
struct _JAlloc {  
    void *(*alloc) (JAlloc *allocator, size_t size);  
    void (*free) (JAlloc *allocator, void *p);  
    void *(*realloc) (JAlloc *allocator, void *p, size_t size);  
};
  1. 这个的 Delphi 翻译是什么?

  2. 在哪里可以找到将 C 头文件手动转换为 Delphi 的好资源(包括指针、预处理器指令等)?

【问题讨论】:

  • 不小心输入了一个答案作为评论(我的答案见下文)。

标签: c delphi pointers function-pointers pascal


【解决方案1】:

使用这种代码

type
  PJAlloc = ^TJAlloc;
  TJAllocAlloc = function(allocator: PJAlloc; size: integer): pointer; cdecl;
  TJAllocFree = procedure(allocator: PJAlloc; p: pointer); cdecl;
  TJAllocRealloc = function(allocator: PJAlloc; p: pointer; size: integer); cdecl;
  TJAlloc = record
    alloc: ^TJAllocAlloc;
    free: ^TJAllocFree;
    realloc: ^TJAllocRealloc;
  end;

根据 C 库的调用约定,将 cdecl 更改为 stdcall。

另一种声明(也许更“pascalish”)可能是:

type
  TJAllocAlloc = function(var allocator: TJAlloc; size: integer): pointer; cdecl;
  TJAllocFree = procedure(var allocator: TJAlloc; p: pointer); cdecl;
  TJAllocRealloc = function(var allocator: TJAlloc; p: pointer; size: integer); cdecl;
  TJAlloc = record
    alloc: ^TJAllocAlloc;
    free: ^TJAllocFree;
    realloc: ^TJAllocRealloc;
  end;

【讨论】:

  • 谢谢布切兹。你知道我在哪里可以找到更多关于在互联网上从 C 翻译到 delphi 的信息吗?我目前正在使用 Rudy 的博客。
  • @Ramnish 我手头没有任何资源。我是通过实验了解到的。但是看看一些 C API(如 OpenGL/GDI+/SQLite)的手动转换,你会发现一些技巧。 Delphi 的优点在于您可以使用 C++ builder(包括免费的命令行编译器)编译 C 代码,然后将生成的 .obj 链接到您的 Delphi 单元。我在 synopse.info/fossil/finfo?name=SQLite3/SQLite3.pas 中使用了一些低级 asm 技巧,例如 _ftol/_ftoul/_lldiv/_llshr 等
  • @Ramnish 看看这个网站:rvelthuis.de/articles/articles-cobjs.html
  • 一个过程变量已经是一个指针了,那么每个字段的TJAlloc记录中的^是错的?还是我弄错了?
【解决方案2】:

博士。 Bob 的 HeadConv 实用程序非常适合用于将 C 声明转换为 Delphi,并且是将 C 源代码与等效的 Pascal 源代码进行比较的良好学习工具。

You can find it here

【讨论】:

  • 它适用于 ODBC 3.0 API 标头,对结果代码进行了一些调整。至于古老的 - 在过去的 12-15 年里,C 没有改变,调用外部 DLL 和库的 Pascal 语法也没有改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
相关资源
最近更新 更多