Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将struct中的空C结构转换为Delphi?_C_Delphi_Winapi_Struct - Fatal编程技术网

如何将struct中的空C结构转换为Delphi?

如何将struct中的空C结构转换为Delphi?,c,delphi,winapi,struct,C,Delphi,Winapi,Struct,如何将下面的空Cstruct内部struct翻译成Delphi(来自winnt.h): typedef结构\u TP\u回调\u环境\u V3{ ... 结构\激活\上下文*激活上下文; ... }TP_回调_环境_V3; 我倾向于只使用指针,因为这个结构不能被操纵,而且它是一个指针。我只是好奇,如果可能的话,人们会如何逐字翻译呢。我在想这样的事情: type PActivationContext = ^TActivationContext; TActivationContext =

如何将下面的空C
struct
内部
struct
翻译成Delphi(来自winnt.h):

typedef结构\u TP\u回调\u环境\u V3{
...
结构\激活\上下文*激活上下文;
...
}TP_回调_环境_V3;
我倾向于只使用
指针
,因为这个结构不能被操纵,而且它是一个指针。我只是好奇,如果可能的话,人们会如何逐字翻译呢。我在想这样的事情:

type
  PActivationContext = ^TActivationContext;
  TActivationContext = record

  end;

  TTPCallbackEnvironV3 = record
    ...
    ActivationContext: PActivationContext;
    ...
  end;

但是,你知道,一个空记录。。。那么,您将如何将上面的结构翻译成Delphi呢?

C结构就是所谓的不完整类型。C代码是用于实现不透明指针的常用技术。通过在C中以这种方式实现它,您就具有了类型安全性,即类型为
struct\u ACTIVATION\u CONTEXT*
的变量与其他指针的赋值不兼容。除了与所有指针类型都兼容的
void*
指针之外

在Delphi中,没有不完整的类型。所以我认为最好的解决方案就是你提出的。准确地模仿C代码并不特别重要。您的目标是获得好处,特别是类型安全。而你的建议可能和你得到的一样好


另一方面,这取决于此类型的可见程度。如果它是非常私有的,可能只在单元的实现部分声明,并且使用很少,那么您可能会采取声明空记录有点过头的立场。您可能认为
PActivationContext=Pointer
是合理的。

空记录的优点是它是一种特定的不同类型,即指向此类记录的指针是指向特定类型的不透明指针。否则,没有区别。不过,我个人更喜欢空记录。FWIW,在C中,不需要空结构,只需要一个未知结构。@Rudy,但如果它不一定是空结构,那么不应该使用不透明指针吗?@TLama:我认为,指向不完整结构的指针是不透明的。顺便说一句:标准C中没有空结构(尽管Gcc默认允许它作为扩展)。谢谢!我将它定义为不透明指针
PActivationContext=type指针实代码。我只是想知道直译的意思。不过,有些事情告诉我,空记录是不正确的。如果它是指向不完整类型的指针(我认为它是应用程序未知的类型),我不应该将它定义为指向空记录的指针,至少因为在场景后面可能有
void
或数组。因此,我认为泛型
指针
是解释未知类型的最佳选择。