将 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;
在转换过程中,我遇到了以下 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;