C++ 如何转换C++;结构到delphi

C++ 如何转换C++;结构到delphi,c++,delphi,enums,type-conversion,record,C++,Delphi,Enums,Type Conversion,Record,我有用C++编写的代码,我想把这段代码翻译成delphi记录类型。我在这方面的知识有限,所以我无法做到这一点。我如何翻译后,工会部分 struct backed_block { unsigned int block; unsigned int len; enum backed_block_type type; union { struct { void* data; } data;

我有用C++编写的代码,我想把这段代码翻译成delphi记录类型。我在这方面的知识有限,所以我无法做到这一点。我如何翻译后,工会部分

struct backed_block
{
    unsigned int block;
    unsigned int len;
    enum backed_block_type type;

    union
    {
        struct
        {
            void* data;
        } data;

        struct
        {
            char* filename;
            int64_t offset;
        } file;

        struct
        {
            int fd;
            int64_t offset;
        } fd;

        struct
        {
            uint32_t val;
        } fill;

    };

    struct backed_block* next;
};

我相信就是这样。您必须确定是否需要打包的记录。您可能还需要更新ThisUserName的TBackedBlockType后面的人的定义(我已经复制到我的示例中),因为您在问题中没有给出这一点

TYPE
  TBackedBlockType      = (bbtData,bbtFD,bbtFile,bbtFill);
  TDataStruct           = PACKED RECORD
                            Data        : POINTER;
                          END;
  TFileStruct           = PACKED RECORD
                            FileName    : PAnsiChar;
                            Offset      : Int64
                          END;
  TFDStruct             = PACKED RECORD
                            FD          : Int32;
                            Offset      : Int64
                          END;
  TFillStruct           = PACKED RECORD
                            Val         : Int32
                          END;
  TUnion                = PACKED RECORD
                            CASE BlockType : TBackedBlockType OF
                              0 : (Data : TDataStruct);
                              1 : (Fil_ : TFileStruct);
                              2 : (FD   : TFDStruct);
                              3 : (Fill : TFillStruct)
                          END;
  PBackedBlock          = ^TBackedBlock;
  TBackedBlock          = PACKED RECORD
                            Block       : UInt32;
                            Len         : UInt32;
                            Union       : TUnion;
                            Next        : PBackedBlock
                          END;
要访问字段,请使用以下格式:

VAR R : TStruct;

R.Union.Data.Data:=NIL;
R.Union.Fill.Val:=32;
R.Union.FD.Offset:=$0123456789ABCEDF;
R.Union.Fil_.FileName:='C:\pagefile.sys';
R.Block:=$DEADBABE;
R.Next:=NIL;
R.Union.BlockType:=TBackedBlockType.bbtData;

由于“File”在Delphi中是一个保留字,所以我不得不将C结构的“File”部分称为“Fil”。同样地,对于字段“Type”->“BlockType”。

更新@HeartWare comment,您可能需要做他说的事情,并更新TUnionTBackedBlockType

type
  TBackedBlockType      = (bbtData,bbtFD,bbtFile,bbtFill);
 
  TUnion                = PACKED RECORD
                            CASE  BlockType:TBackedBlockType OF
                              bbtData : (Data : TDataStruct);
                              bbtFile : (File_ : TFileStruct);
                              bbtFD   : (FD   : TFDStruct);
                              bbtFill : (Fill : TFillStruct)
                          END;


 var
  X : TBackedBlock;
begin

  x.Block := 1;
  x.Len   := 256;
  //x.Union.BlockType := bbtFile; only needed if you write to the struct 
  case x.Union.BlockType of
    bbtData  : begin
                 {.. Read or Write ....}
               end;
    bbtFile  : begin
                {Example}
                x.Union.File_.FileName := 'FileName';
                x.Union.File_.Offset   := 13;
               end;
    bbtFD    : begin
             {.. Read or Write ....}
               end;
    bbtFill  : begin
             {.. Read or Write ....}
               end;
  end;

在这种情况下,您需要将最内层的结构定义为单独的类型,然后将它们连接在一个表中,然后可以将其包含在最外层的记录中。当我编写指针时,我无法成功地使用malasef代码。我不明白你在说什么。你的问题已经结束了,所以我不能给你举个例子。如果它被重新打开,我可以。我问错了问题并更正了,我希望它是活跃的。如果你能帮我的话我会很乐意的是的,我读过了,但我不明白那部分是什么。我需要将变量的大小写定义为。大小写指针是否正确?C代码使用ANSI作为
文件名
,这在Delphi中是
PAnsiChar
。而
fd
应该是
整数
/
Int32
而不是
THandle
,因为C代码使用的是
int
而不是
void*
/
文件*
/
句柄
@RemyLebeau:C代码使用的是“char”-这是否等同于ANSI字符或UNICODE字符(取决于目标)?自从我从C语言编程升级到Delphi(:-)已经有一段时间了,所以我可能有点生疏了。。。THandle/Int32是一个品味问题。我很确定这是一个有问题的文件句柄,所以在我看来,使用THandle来显示这一点是合适的(THandle=UInt32/UInt64,具体取决于目标,这同样适用于OP希望在某个时候升级到64位,而Int32将无法保存文件句柄)。“不是[char]根据目标是否等同于ANSI字符或UNICODE字符?”-否。您考虑的是
TCHAR
宏。“THandle/Int32是口味问题”-不,不是。这是一个API使用的问题。基于整数的I/O描述符与基于句柄的I/O非常不同。你不能随意交换它们,如果这段代码需要与其他代码接口(否则为什么要翻译它呢?),请注意,如果你在CASE部分中包含一个字段(CASE BlockType:TBackedBlockType),它实际上会分配该字段,因此,在这种情况下,应该将其从“外部”记录定义中删除。是否仍分配了“enum backed_block_type;”(如果是这种情况,它应该可以工作),正如我所看到的,您已经更改了与我一样的结构。原因是什么?对不起,如果我做错了什么,我是新来的。我的评论是为了澄清,如果要将你的帖子和我的帖子合并成一个帖子,那么你应该记住要么使用我的案例(不分配任何字段)并在联盟外部使用我的显式分配,要么使用你的案例(分配字段),然后在联盟外部删除我的显式分配。如果一个人使用你的案例和我在工会之外的分配,那么他将得到一个错误的翻译。我将你对TBackedBlockType的类型定义合并到我的答案中,使其成为一个完整的示例,这样他就不必手动合并两个不同的帖子。我还转到了CASE字段:风格类型(我已经忘记了这是可能的,而it-IMO-是更合适的方式)。因此,没有任何违规行为,你的帖子确实让我想起了那个特殊的语法…:-)谢谢你的澄清,伙计,我想,我现在明白了。