如何在CORBA IDL中声明/使用对struct的前向引用?

时间:2013-06-23 00:38:38

标签: corba forward-declaration idl idlj

我有以下CORBA IDL 3.2,它试图声明一个相互递归的结构:

module SE
{
  interface SE
  {

typedef unsigned short MenuItemID; // a small integer representing a unique menu item

enum MenuSubaction { CollectCharacter, CollectStruct };

struct MenuItemAction;   // forward declaration

union MenuSubactionParameter switch (MenuSubaction)
{  case CollectStruct:  MenuItemAction sub_structure;    // <<<<<<<<< use of forward
};

struct MenuItemAction {   MenuSubaction menu_subaction;
              MenuSubactionParameter menu_subaction_parameter;
              };
  }; // interface
}; // module

我在标有&lt;&lt;&lt;&lt;&lt;&lt;&lt;

的行上收到Sun JDK 1.7 idlj的投诉
 ... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction.

注意:这不是“前向接口”声明。

什么是“不完整的前瞻性声明”? (如果你成功地宣布为前向声明,我不认为前向声明是不完整的,只是尚未定义。也许这只是一个容易被误解的短语)。

更重要的是,我如何设法定义递归结构?

我是CORBA的新手,所以我不是真的: - }知道我在做什么。我不明白为什么CORBA不能定义这样的递归结构;一个传输不会递归的特定实例。特别是,这个树形成了一个树,CORBA可以“轻松”发送。

编辑:Brian有正确的答案。我需要替换直接提及前向参考,

         MenuItemAction sub_structure

         sequence<MenuItemAction> sub_structure>  

2 个答案:

答案 0 :(得分:1)

它似乎是一个已知的错误“4754974:idlj不支持结构和联合的前向声明”: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4754974

在上面的评论之后我尝试了:

module SE
{
  interface SE
  {

    typedef unsigned short MenuItemID; // a small integer representing a unique menu item

    enum MenuSubaction { CollectCharacter, CollectStruct };

    struct MenuItemAction;   // forward declaration

    union MenuSubactionParameter switch (MenuSubaction)
    {
      case CollectStruct:  sequence<MenuItemAction> sub_structure;    // <<<<<<<<< use of forward
    };

    struct MenuItemAction {
      MenuSubaction menu_subaction;
      MenuSubactionParameter menu_subaction_parameter;
  };
}; // interface

哪个有效。你最终会得到一个序列而不是单个记录,但出于实际目的,这可能不是问题。

答案 1 :(得分:1)

你可以转发声明结构,但有很多限制。

编辑:我不知道您使用的是哪个版本的CORBA,但是在2.6.1 specification中它在3.10.2.3节中强调(强调我的):

  

IDL语法允许生成递归结构和   通过具有序列类型的成员的工会。

后来:

  

IDL支持   通过结构和联合的前向声明递归类型   (以及有价值的类型)。

后来:

  

不完整类型只能作为序列的元素类型出现   定义。具有不完整元素类型的序列称为a   不完整的序列类型。

     

不完整的序列类型只能作为另一个序列的元素类型出现,   或者作为结构或联合定义的成员类型。

示例:

struct Foo; // Forward declaration; Foo is incomplete
typedef sequence<Foo> FooSeq;  // incomplete sequence type
struct Foo {
   long value;
   FooSeq chain; // incomplete seq. type used as struct member; OK
};

可以在链接中找到更多信息,包括此示例,它可能更接近您想要做的事情:

union Bar; // Forward declaration
typedef sequence<Bar> BarSeq;

union Bar switch(long) { // Define incomplete union
   case 0:
      long l_mem;
   case 1:
   struct Foo {
      double d_mem;
      BarSeq nested; // OK, recurse on enclosing
                     // incomplete type
   } s_mem;
};