【问题标题】:How to translate an empty C struct inside struct to Delphi?如何将结构内的空C结构转换为Delphi?
【发布时间】:2014-12-01 17:00:38
【问题描述】:

如何将 struct 内的以下空 C struct 逐字翻译为 Delphi(来自 winnt.h):

typedef struct _TP_CALLBACK_ENVIRON_V3 {
    ...
    struct _ACTIVATION_CONTEXT        *ActivationContext;
    ...
} TP_CALLBACK_ENVIRON_V3;

我倾向于只使用Pointer,因为这个结构不能被操纵,而且它无论如何都是一个指针。我只是好奇如何按字面意思翻译它(如果可能的话)。我在想这样的事情:

type
  PActivationContext = ^TActivationContext;
  TActivationContext = record

  end;

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

但是,你知道,一个空记录......那么,你如何将上述结构翻译成 Delphi?

【问题讨论】:

  • 空记录的优点是它是一种特定的不同类型,即指向此类记录的指针是指向特定类型的不透明指针。否则,没有区别。不过,我个人更喜欢空记录。 FWIW,在 C 中,不需要一个空结构,只是一个未知结构。
  • @Rudy,但如果它不一定是空结构,那么不应该使用不透明指针吗?
  • @TLama:我想说,指向不完整结构的指针非常不透明。顺便说一句:标准 C 中没有空结构(尽管例如 Gcc 默认允许它作为扩展)。

标签: c delphi winapi struct


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我将在实际代码中将其定义为不透明指针PActivationContext = type Pointer;。我只是想知道直译。不过,有些事情告诉我空记录是不正确的。如果它是一个指向不完整类型的指针(我认为它是应用程序未知的类型),我不应该将它定义为指向空记录的指针,至少因为可以有void 或场景后面的数组。所以我认为genericPointer是解释未知类型的最佳选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多