将 C headers 转换为 Delphi - 不透明数据类型

Converting C headers to Delphi - Opaque Data Type

在转换过程中,我遇到了以下 C 代码:

/** Opaque data type for the error object.
*/
typedef struct kError * KErrorRef;

kError 声明在哪里?

Rudy Velthuis 提供的 conversion tool 生成此代码:

type
  {$EXTERNALSYM KErrorRef}
  KErrorRef = ^kError;

当我尝试编译它时,我收到此错误消息:

[dcc32 Error] ukError.pas(50): E2003 Undeclared identifier: 'kError'

转换 C 代码的正确方法是什么?

我会声明一个空记录,然后声明一个指向它的指针。这给了你类型安全。

type
  KErrorRef = ^kError;
  kError = record
  end;

Where is kError declared?

无处可去,因为实际上并不需要。

在此声明中:

typedef struct kError * KErrorRef;

struct kError是不完全类型,与指针一起使用是允许的。

声明大致相当于:

// forward declaration of some as-yet unknown struct type
struct kError;

// this is OK; compiler knows the size of a pointer, which is not
// affected by the size of the actual struct being pointed to
typedef kError *KErrorRef;

The conversion tool provided by Rudy Velthuis produces this code

该工具在此实例中未生成正确的 Delphi 代码。在处理不完整 (forward-declared) 结构类型的 typedef 时,如果未声明实际结构类型,它 应该 生成更像这样的代码 Delphi后来:

type
  {$EXTERNALSYM KErrorRef}
  KErrorRef = ^kError;
  {$NODEFINE kError}
  kError = record
  end;