2

インターフェイスを表す IDL ファイルを発行します。インターフェイスが呼び出されたときにそれらをマップするために使用できるように、C++/C コードと同様の構造になります。そのため、何らかの変換 (同等の) 表現が必要になります。
IDLの a のように、C++ などで sequenceは で表されます。list

最近、次のような複雑な (一意の) 有効な IDL ファイルに出くわしました -

union HostAddress switch(EAddType)
 {  
      case E_IPV_4:  
          char ipv4Addr[4];  
      case E_IPV_6:  
           char ipv6Addr[16]; 
 };

  • この構造はどのように役立つでしょうか。そのような組合を持つことの意味は何ですか?
  • 上記の IDL 構造を C/C++ で表現するにはどうすればよいでしょうか?
4

3 に答える 3

0

IDL 共用体は、C または C++ の共用体に似ています。スペースを節約するために、フィールドは同じメモリを共有します。IDL ユニオンが C++ にマップされる方法の完全なルール セットは、IDL から C++ へのマッピング ドキュメント にあります。

一般的に、私のアドバイスはそれらを避けることです。これらは紛らわしく、C++ マッピングで使用するのは困難です。

于 2012-08-18T17:38:22.017 に答える
0

ユニオン構造は、最大のメンバーを格納するのに十分な大きさの不透明なデータ ブロックを提供します。この場合、タイプ フィールドを持つオブジェクトがあり、IPv6 アドレスを含む 16 バイトがあり、IPv4 アドレスも格納されます。これにより、IPv4 アドレスと v6 アドレスの両方を処理できる単純なコードを作成できます。完全なオブジェクト。ユニオンは通常、このような小さなオブジェクトに使用されます。この場合、すべてのケースを処理できる統合されたオブジェクトを持つためにスペースが無駄になります。ユニオンに関するウィキペディアの記事と、ユニオンに関するウィキブックのページを参照してください

それが役立つことを願っています。

于 2012-08-18T08:03:13.640 に答える
0

Websphere documentationCORBA documentationで適切な説明を見つけました。特に、CORBA ドキュメントの詳細な説明が気に入りました。追加の入力があれば、私の投稿に答えてください!

というわけで以下の例

union HostAddress switch(EAddType)
 {  
      case E_IPV_4:  
          char ipv4Addr[4];  
      case E_IPV_6:  
           char ipv6Addr[16]; 
 };

次のように実装されます -

struct HostAddress
{
    EIPVSET _discriminant;
    long _d() { return _discriminant; }

    HostAddress() { _discriminant = E_IPV_INVALID; }
    string addressIpv6()   //get function overloaded
    {
       return string(this.ipv6Addr);
    }

    void addressIpv6(const string& ipv6Addr) //set function overloaded
    {
        strncpy(this.ipv6Addr,ipv6Addr.c_str(),16);
        return;
    }

    //similarly for other member variables.

}
于 2012-08-18T08:03:25.497 に答える