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