如何在 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你可以转发声明结构,但是有很多限制。
编辑:我不知道您使用的是什么版本的 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这似乎是一个已知的错误“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)以上是关于如何在 CORBA IDL 中声明/使用对结构的前向引用?的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse Kepler CORBA 插件不会编译 IDL 文件