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

     前  次    新規ウィンドウで目次を開く  新規ウィンドウで索引を開く  PDFとして表示 - 新規ウィンドウ  Adobe Readerを取得 - 新規ウィンドウ
コンテンツはここから始まります

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」を使用して定義されます。


  先頭に戻る       前  次