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 编译器)是不是支持前向声明?的主要内容,如果未能解决你的问题,请参考以下文章

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

带有朋友而不是前向声明的类,:哪个编译器是正确的[重复]

Sun C++ 编译器和 Boost

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

非抽象且不覆盖抽象方法 - IDL

在 Visual Studio 2010 中编译 IDL 文件时无法生成必要的文件