【问题标题】:Convert C struct to Delphi将 C 结构转换为 Delphi
【发布时间】:2014-03-11 08:28:07
【问题描述】:

如何将此结构转换为 Delphi?

typedef struct a_config {
    union {
        struct {
            char mode[10];
            char name[10];
        } dn;

        struct {
            int r;
        } sm;

        struct {
            int r;
        } xo;
    } config;
} a_config_t;

【问题讨论】:

  • 这是为了互操作吗?你需要二进制兼容性吗?

标签: c delphi struct unions


【解决方案1】:

联合等于记录中的case of 构造。并非所有内容都可以 1:1 翻译,但可以。

请注意,包装是一个单独的问题。虽然在这种情况下可能又不是问题。

type
  a_config_t = record
    config : record
      case integer of 
        0:(dn: record 
             mode : array[0..9] of ansichar;    
             name : array[0..9] of ansichar;
           end);
        1: (sm: record
             r: integer;
           end);
        2: (xo: record
             r: integer;
           end);
    end;
  end;

// Delphi has no eq for "struct x" in "struct x {} y" construct, only for the y 
a_config = a_config_t;  

【讨论】:

    【解决方案2】:

    C/C++ 联合类似于 Delphi 变体记录。直译是:

    type
      dn_t = record
        mode, name: array [0..9] of AnsiChar;
      end;
    
      sm_t = record
        r: integer;
      end;
    
      xo_t = record
        r: integer;
      end;
    
      a_config = record
        case integer of
        0: (dn: dn_t);
        1: (sm: sm_t);
        2: (xo: xo_t);
      end;
    

    在文档中阅读有关变体记录的更多信息:http://docwiki.embarcadero.com/RADStudio/en/Structured_Types#Variant_Parts_in_Records

    在这种情况下,您可以通过删除嵌套记录来进行更简单的翻译:

    type
      a_config = record
        case integer of
        0: (mode, name: array [0..9] of AnsiChar);
        1: (r: integer);
      end;
    

    【讨论】:

    • NP,变体记录并不常用。此外,我认为语法与其他语言的风格不符。
    • 不是在 Delphi 中,而是在不允许硬转换的经典 pascal 中,它们是唯一的二进制类型转换可能性。还是那个 Modula2?,我总是把它们混在一起
    • @MarcovandeVoort 我确定 Modula-2 允许类型转换和转换。我记得,在某些方面,Modula-2 比原来的 Pascal 稍微宽松一点。它旨在用作系统编程语言。自从我在 Modula-2 中编码以来已经过了很长时间......
    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多