2

我们发布 IDL 文件来表示接口,并且将具有与 C++/C 代码类似的结构,以便我们可以在调用接口时使用它们来映射它们。因此需要一些转换(等效)表示。
就像sequenceIDL 中的alist在 C++ 等 中表示。

最近,我遇到了一个复杂(独特)的有效 IDL 文件,例如 -

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

  • 这个结构对我们有什么帮助?有这样的工会有什么意义?
  • 我们如何在 C/C++ 中表示上述 IDL 结构?
4

3 回答 3

0

IDL 联合类似于 C 或 C++ 中的联合。这些字段共享相同的内存以节省空间。您可以在IDL to C++ Mapping Document中找到关于 IDL union 如何映射到 C++ 的完整规则集。

一般来说,我的建议是避免它们。它们在 C++ 映射中令人困惑且难以使用。

于 2012-08-18T17:38:22.017 回答
0

联合结构为您提供了一个足够大以包含最大成员的不透明数据块。在这种情况下,您将拥有一个带有 type 字段的对象,然后是 16 个字节来包含 ipv6 地址,它还将存储 ipv4 地址,这使您可以编写可以同时处理 ipv4 和 v6 地址的简单代码,而无需花费完整的对象。联合通常用于像这样的小对象,在这种情况下,您将浪费空间来拥有一个可以处理所有情况的统一对象。参见关于工会的维基百科文章和关于工会的维基书籍页面

希望有帮助。

于 2012-08-18T08:03:13.640 回答
0

我确实在Websphere 文档CORBA 文档中找到了很好的解释。我特别喜欢 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 回答