3

我有以下 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

我收到 Sun JDK 1.7 idlj 在标有 <<<<< 的投诉

 ... SE.idl (line xx): Illegal reference to incomplete forward declaration of type MenuItemAction.

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

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

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

我是 CORBA 的新手,所以我真的不知道 :-} 知道我在做什么。我不明白为什么 CORBA 不能定义这样的递归结构;一个传输一个不会递归的特定实例。特别是,它形成了一棵树,对于 CORBA 来说应该是“容易”发送的。

编辑:布赖恩有正确的答案。我需要替换前向引用的直接提及,

         MenuItemAction sub_structure

         sequence<MenuItemAction> sub_structure>  
4

2 回答 2

1

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

编辑:我不知道您使用的是什么版本的 CORBA,但在2.6.1 规范中,它在第 3.10.2.3 节(强调我的)中说:

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

然后:

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

然后:

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

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

例子:

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;
};
于 2013-06-25T01:05:06.050 回答
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

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

于 2013-06-23T13:45:47.410 回答