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

Tho*_*mas 1 delphi delphi-10.1-berlin

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

/** Opaque data type for the error object.
*/
typedef struct kError * KErrorRef;
Run Code Online (Sandbox Code Playgroud)

在哪里kError申报?

Rudy Velthuis提供的转换工具生成以下代码:

type
  {$EXTERNALSYM KErrorRef}
  KErrorRef = ^kError;
Run Code Online (Sandbox Code Playgroud)

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

[dcc32 Error] ukError.pas(50): E2003 Undeclared identifier: 'kError'
Run Code Online (Sandbox Code Playgroud)

转换C代码的适当方法是什么?

Rem*_*eau 7

声明了kError在哪里?

无处,因为它实际上并不需要.

在这个声明中:

typedef struct kError * KErrorRef;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Rudy Velthuis提供的转换工具生成此代码

在这种情况下,该工具不会生成正确的Delphi代码.当处理一个不完整(正向声明)结构类型的typedef时,它应该生成更像这样的Delphi代码,如果以后没有声明实际的struct类型:

type
  {$EXTERNALSYM KErrorRef}
  KErrorRef = ^kError;
  {$NODEFINE kError}
  kError = record
  end;
Run Code Online (Sandbox Code Playgroud)

  • FWIW,我的[转换包](http://rvelthuis.de/programs/convertpack.html)的文档说:"他们不会处理每一个构造,但是大多数构造,只剩下几个项目手动转换." 这是手动转换的项目之一. (4认同)

Dav*_*nan 6

我将声明一个空记录,然后指向它.这为您提供了类型安全.

type
  KErrorRef = ^kError;
  kError = record
  end;
Run Code Online (Sandbox Code Playgroud)