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

Posted

技术标签:

【中文标题】如何在 CORBA IDL 中声明/使用对结构的前向引用?【英文标题】:How to declare/use forward reference to struct in CORBA IDL? 【发布时间】:2013-06-23 00:38:37 【问题描述】:

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

【问题讨论】:

我不认为你可以拥有同名的模块和接口。您还缺少 IDL 中的一些右括号。你能清理一下代码吗? 我试图发布一个答案,但我对这方面的知识有点捉襟见肘。同时,您可以查看此链接,它可能会有所帮助。 sandeshudupa.blogspot.com/2006/04/… cs.uic.edu/~troy/fall04/cs441/drake/CORBA.html 说“IDL 支持构造类型的前向声明,例如 struct Point;”。您的链接还表明这是有效的,至少在 Sequence 中是有效的。我无法想象,如果他们可以支持 Sequence,他们就不能支持完全 one 元素的序列,因此直接支持 struct 本身。 但只能作为“操作参数类型或在其完整声明出现之前的序列元素类型”。 好的,我取消删除我的答案并再次尝试。 【参考方案1】:

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

编辑:我不知道您使用的是什么版本的 CORBA,但在 2.6.1 specification 中它在第 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;
;

【讨论】:

我会尝试这个只是为了看看前向结构的工作,但你是对的,它不是我想要的。有很多关于接口如何具有前向声明的讨论。结构(从我的角度来看,类似于 C++),只是弱对象/接口。我想嵌套结构作为值的概念必须被禁止。这将构成一个无限大的数据结构,因此需要的是 struct-as-reference (这就是它在 C 中的工作方式),而这在 IDL 中是不可能直接说出来的。可能这就是接口与结构不同的原因。它们被有效地视为参考...... ... 也许这就是 Sequence 的理由。 我得等到明天才能检查出来,我不在我的开发系统上。 我刚刚通过引用 CORBA 规范更新了我的答案。抱歉,应该从一开始就这样做。 好的,有章有节。所以我假设明天的实验会成功:-【参考方案2】:

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

在我尝试了上面的 cmets 之后:

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

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

【讨论】:

那个错误报告有点意思,但它是从 2002 年开始的,所以有足够的时间来修复它,它在 2004 年被标记为“已解决”。不错的尝试。 结构前向引用甚至不符合 CORBA IDL 语法参见规则 50 in sce.carleton.ca/netmanage/corba/idlsyn.htm (50) ::= "struct" "" ""我知道 IBM 是第一批忽略这一事实的供应商之一。 Sun 似乎也尝试过。 我不确定我是否理解您刚刚告诉我的内容。您是说我提供的示例中的前向引用声明是正确的吗? idlj 不反对;它稍后反对。您的结构语法示例看起来不错……对于完整的结构声明;为什么一个人需要所有这些东西来进行前向声明,而重点是把这些东西排除在外? “我知道 IBM ......忽略这个(什么?)事实”。

以上是关于如何在 CORBA IDL 中声明/使用对结构的前向引用?的主要内容,如果未能解决你的问题,请参考以下文章

CORBA:CORBA IDL 类型可以是另一个属性吗?

Eclipse Kepler CORBA 插件不会编译 IDL 文件

在 Java 中使用 Eclipse 为 CORBA IDL 启动命名服务

传递数组或序列以在 idl Java Corba 中运行

CORBA IDL 到 C++ - 字符与无符号字符?

CORBA IDL 哈希图