idjl(Sun IDL 编译器)是不是支持前向声明?
Posted
技术标签:
【中文标题】idjl(Sun IDL 编译器)是不是支持前向声明?【英文标题】:Does idjl (Sun IDL compiler) support forward declaration?idjl(Sun IDL 编译器)是否支持前向声明? 【发布时间】:2012-08-18 08:40:23 【问题描述】:我必须在我的学校项目中使用 idlj,但在我的 idl 文件中,我还需要使用前向声明。有人知道 idlj 是否支持前向声明吗?我试图这样做,但它给出了错误:
interface1.idl(第 34 行):有对 Class1 的前向引用,但是 它没有定义。
任何想法如何克服这个问题?不幸的是,我无法使用任何其他 idl 编译器......而且我找不到任何有关此的信息。
编辑:
interface1.idl:
interface SecondClass;
interface FirstClass
//...
;
interface2.idl:
interface FirstClass;
interface SecondClass
//...
;
idlj -fclient interface1.idl
给:
interface1.idl(第 8 行):有对 SecondClass 的前向引用, 但它没有定义。 ; ^
【问题讨论】:
几乎可以肯定。您可能会收到错误,因为您最终从未定义Class1
。没有看到你的 IDL 是不可能说的。
@Brian Neal:这很奇怪,请看一下我的编辑 - 我定义了 Class1
(现在 vel FirstClass
)
在某些时候,IDL 翻译器需要查看 SecondClass 的定义。
@Brian Neal: 好的,但这里include
不是解决方案——如果我使用include
指令,我会有一个循环依赖...我不能在一个IDL 中同时拥有这两个接口文件 - 还有其他解决方案吗?
在interface1.idl 的底部你可以#include interface2.idl 这样IDL 编译器最终可以看到Second class 是什么。它必须查看 SecondClass 的定义,以便为 FirstClass 生成正确的代码。
【参考方案1】:
#ifndef _SecondClass
#define _SecondClass
#include "interface1.idl"
interface SecondClass
typedef sequence<FirstClass> firstVector;
SecondClass create();
;
#endif
#ifndef _FirstClass
#define _FirstClass
#include "interface2.idl"
interface FirstClass
typedef sequence<SecondClass> secondVector;
FirstClass create();
;
#endif
看看this。将此模式用于所有相互依赖的接口。
【讨论】:
哎呀,我不明白:我改变了我的代码,正如你所建议的那样:pastie.org/private/mfhfe07igooquih55dfcfw 并得到了错误:pastie.org/private/qnuyzoeunhsdklxf8d610q 我手边没有 IDL 编译器;你必须回到你的工作版本并修改它。发布结果,以便其他人知道什么有效。 您是否安装了 Java?它立即带有 idlj (IDL) 编译器。好的,我将编辑我的帖子并在那里写下有用的内容【参考方案2】:我不熟悉那个 ORB,但应该可以。请记住,如果您转发声明一个类,您最终必须在某处提供定义,以便翻译器知道该做什么。
例如:
interface SecondClass; // forward declaration
interface FirstClass
SecondClass foo();
;
// now you must provide the IDL for SecondClass;
// either write it out here or #include the appropriate IDL file
【讨论】:
是的,我知道这一切,但正如我所说:我不能包含接口,我必须每个 idl 文件有一个接口。 @mazix 为什么你不能#include 一个接口?它不会导致循环依赖。如果做不到这一点,为什么每个 IDL 文件必须有一个接口?它不能以任何其他方式完成。您必须将这两个定义放在同一个文件中,通过#include 或仅包含 1 个 IDL 文件。 @mazix 参见例如documentation.progress.com/output/Iona/orbix/mainframe/6.2/pli/…【参考方案3】:我的代码的这个版本终于可以工作了(编译时没有错误),但我仍然不知道如何以及为什么;P
我不知道如何以及为什么,但它最终编译没有错误,看看:
文件 interface1.idl
#ifndef __FIRSTCLASS_IDL__
#define __FIRSTCLASS_IDL__
#include "interface2.idl"
interface FirstClass
typedef sequence<SecondClass> secondVector;
FirstClass create();
;
#endif
文件 interface2.idl
#ifndef __SECONDCLASS_IDL__
#define __SECONDCLASS_IDL__
interface FirstClass;
interface SecondClass
typedef sequence<FirstClass> firstVector;
SecondClass create();
;
#include "interface1.idl"
#endif
我有点困惑,为什么一个include
指令位于 idl 文件的顶部,而另一个必须位于底部。有人知道吗?天哪!
【讨论】:
这正是我在回答中告诉你要做的。以上是关于idjl(Sun IDL 编译器)是不是支持前向声明?的主要内容,如果未能解决你的问题,请参考以下文章