Tuxedo CORBA プログラミング リファレンス

     前  次    新しいウィンドウで目次を開く     
ここから内容の開始

OMG IDL 構文と C++ IDL コンパイラ

Object Management Group (OMG) インタフェース定義言語 (IDL) は、クライアント オブジェクトから呼び出し、オブジェクトの実装で提供するインタフェースを記述します。OMG IDL インタフェース定義では、各オペレーションのパラメータをすべて指定して、インタフェースのオペレーションを使用するクライアント アプリケーションの開発に必要な情報を提供します。

クライアント アプリケーションは、OMG IDL 文のマッピング先として定義されている言語で作成されます。OMG IDL 文とクライアント言語の構造体とのマッピング方法は、クライアント言語で利用可能な機能によって異なります。たとえば、OMG IDL の例外を、例外の概念を持たない言語の構造体、または概念を持つ言語の例外にマップすることができます。

OMG IDL 文は、C++ 文と同じ文法規則に従います。ただし、分散概念をサポートするための new キーワードが導入されています。また、OMG IDL 文は、標準的な C++ プリプロセッサ機能および OMG IDL 固有のプラグマをフル サポートしています。

注意 : pragma version 文を使用する場合は、対応するインタフェース定義の後に配置する必要があります。次の例で正しい使い方を示します。
module A
{
interface B
{
#pragma version B "3.5"
void op1();
};
};

OMG IDL の文法は、オペレーション呼び出しメカニズムをサポートするための構造体が追加された ANSI C++ のサブセットです。OMG IDL は宣言型言語であり、定数、型、およびオペレーションの宣言に関して C++ の構文をサポートしています。ただし、アルゴリズミックな構造体または変数は含まれません。

OMG IDL の文法の詳細については、「Common Object Request Broker: Architecture and Specification Revision 2.4」の第 3 章「OMG IDL Syntax and Semantics」を参照してください。

OMG IDL の文法はサポートされていますが、次の型宣言および関連リテラルを除きます。

注意 : CORBA 2.4 では native 型宣言が、ユーザ インタフェース用ではなく、オブジェクト アダプタ用として記述されているので、この型は、コールバックをサポートしているクライアントの PortableServer モジュール、つまり共同クライアント/サーバでのみ利用可能です。

これらのデータ型を IDL 定義で使用しないでください。

注意 : Oracle Tuxedo CORBA のリリース 8.0 では、long longunsigned long longwchar、および wstring データ型のサポートが追加されました。

 


OMG IDL コンパイラの拡張機能

IDL コンパイラでは、プラットフォーム固有のプリプロセッサ マクロを定義します。すべてのマクロは使用するプリプロセッサによって定義済みで、ユーザ定義のマクロに加えて、OMG IDL ファイルで使用できます。また、OMG IDL ファイルをコンパイルまたはロードする場合にも独自のマクロを定義できます。

表 1-1 では、各プラットフォーム用の定義済みマクロについて説明します。

表 1-1 定義済みのマクロ
マクロ識別子
マクロが定義されているプラットフォーム
__unix__
Sun Solaris、HP-UX、および IBM AIX
__sun__
Sun Solaris
__hpux__
HP-UX
__aix__
IBM AIX
__win_nt__
Microsoft Windows

 


C++ IDL コンパイラの制約

表 1-2 は、Oracle Tuxedo 9.1 の C++ IDL コンパイラの制約について説明し、推奨される対策を示しています。

表 1-2 C++ IDL コンパイラ
制約
OMG IDL コンテキスト文字列でワイルドカードを使用すると、警告メッセージが表示されます。
 
説明
警告メッセージは、ワイルドカード文字を含むコンテキスト文字列をオペレーションの定義で使用した場合に、C++ IDL コンパイラによって表示されます。コンテキスト文字列を OMG IDL オペレーション定義で指定すると、次の警告メッセージが表示される場合があります。
void op5() context("*");
^
LIBORBCMD_CAT:131: INFO: ‘*’ は標準以外の
コンテキスト・プロパティです。
 
対策
OMG CORBA 仕様では、コンテキスト文字列の先頭に英数字を使用しなければならないかどうかについて明確に指定されていません。
この警告メッセージは、解釈によっては OMG CORBA 仕様に準拠していないことを通知するためのものです。上記のように、すべての文字列をコンテキスト文字列として指定する場合、OMG CORBA 仕様では、先頭に英文字を使用した文字列からなるカンマ区切りのリストが必要です。

注意 : 上記の例は OMG CORBA に準拠していませんが、Oracle Tuxedo ソフトウェアによってユーザの意図したとおりに処理されます。

制約
OMG IDL コンテキスト文字列でワイルドカードを使用すると、警告メッセージが表示されます。
 
説明
警告メッセージは、ワイルドカード文字を含むコンテキスト文字列をオペレーションの定義で使用した場合に、C++ IDL コンパイラによって表示されます。コンテキスト文字列を OMG IDL オペレーション定義で指定すると、次の警告メッセージが表示される場合があります。
void op5() context("*");
^
LIBORBCMD_CAT:131: INFO: ‘*’ は標準以外の
コンテキスト・プロパティです。
 
対策
OMG CORBA 仕様では、コンテキスト文字列の先頭に英数字を使用しなければならないかどうかについて明確に指定されていません。
この警告メッセージは、解釈によっては OMG CORBA 仕様に準拠していないことを通知するためのものです。上記のように、すべての文字列をコンテキスト文字列として指定する場合、OMG CORBA 仕様では、先頭に英文字を使用した文字列からなるカンマ区切りのリストが必要です。

注意 : 上記の例は OMG CORBA に準拠していませんが、Oracle Tuxedo ソフトウェアによってユーザの意図したとおりに処理されます。

制約
C++ IDL コンパイラが一部のデータ型をサポートしていません。
 
説明
現在、C++ IDL コンパイラは、CORBA 仕様バージョン 2.4 で定義されている以下のデータ型をサポートしていません。
  • native
  • fixed
  • long double
 
対策
これらのデータ型を IDL 定義で使用しないようにします。
制約
識別子で特定の文字列を使用すると、C++ IDL コンパイラが不正なコードを生成することがあります。
 
説明
識別子に以下の文字列を使用すると、コードが正しく生成されず、コードのコンパイル時にエラーが発生します。
get_
set_
Impl_
_ptr
_slice
 
対策
これらの文字列を識別子に使用しないようにします。
制約
大文字/小文字の区別に関して、IDL コンパイラの動作に一貫性がありません。
 
説明
CORBA 標準によると、大文字/小文字の区別だけが異なる IDL 識別子は競合と見なされ、コンパイル エラーが発生します。現在、Oracle Tuxedo IDL コンパイラには、C++ バインディングに関して、値型を除き名前の競合を検出して報告しない場合があるという制限があります。値型については、CORBA での標準に従って、大文字/小文字が区別されます。
 
対策
大文字/小文字の区別だけが異なる IDL 識別子を使用しないようにします。
制約
C++ IDL typedef の問題があります。
 
説明
C++ IDL コンパイラは、次の場合にコンパイルできないコードを生成します。
  • char または boolean 型の IDL 変数を宣言した場合
  • かつ上記の型が複数回エリアスになる場合
たとえば、次の IDL コードから生成された C++ コードはコンパイルできません。
module X
{
typedef boolean a;
typedef a b;
interface Y
{
attribute b Z;
};
};
C++ コンパイラは、「operator <<」が不明確であり、char 型の「operator>>」がないことを示すエラーを報告します。これらのエラーは、typedef のレベルが複数になっているために発生します。つまり、X::a という中間の型定義があるため、C++ コンパイラは、型 X::bCORBA::Boolean を関連付けることができません。
 
対策
char または boolean 型を定義する場合は、間接レベルを 1 つにします。上記の IDL の例では、属性「X::Z」は、ユーザ型「X::b」ではなく、標準型「boolean」またはユーザ型「X::a」を使用して定義されます。


  ページの先頭       前  次