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

时间:2018-04-04 18:27:29

标签: delphi delphi-10.1-berlin

在转换过程中,我遇到了以下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代码的适当方法是什么?

2 个答案:

答案 0 :(得分:7)

  

声明kError在哪里?

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

在此声明中:

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;
  

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

在这个例子中,该工具没有生成正确的Delphi代码。当处理一个不完整(正向声明的)结构类型的typedef时,应该生成更像这样的Delphi代码,如果以后没有声明实际的结构类型:

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

答案 1 :(得分:6)

我声明一个空记录,然后是一个指向它的指针。这样可以确保您的类型安全。

type
  KErrorRef = ^kError;
  kError = record
  end;