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代码的适当方法是什么?
声明了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)
我将声明一个空记录,然后指向它.这为您提供了类型安全.
type
KErrorRef = ^kError;
kError = record
end;
Run Code Online (Sandbox Code Playgroud)