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

次の表では、Oracle Tuxedo 9.1のC++ IDLコンパイラの制約について説明し、推奨される回避方法に関する情報を示します。

表1-2 C++ IDLコンパイラ

制約 OMG IDLコンテキスト文字列でワイルドカードを使用すると、警告メッセージが表示されます。
  説明 ワイルドカード文字を含むコンテキスト文字列を操作の定義で使用した場合、C++ IDLコンパイラによって警告メッセージが表示されます。コンテキスト文字列をOMG IDL操作定義で指定すると、次の警告メッセージが表示される場合があります:
void op5() context("*");
                    ^
LIBORBCMD_CAT:131: INFO: ‘*’ is a non-standard
context property.
  回避策 OMG CORBA仕様では、コンテキスト文字列の先頭に英数字を使用しなければならないかどうかについて明確に指定されていません。

この警告メッセージは、解釈によってはOMG CORBA仕様に準拠していないことを通知するためのものです。上記のように、すべての文字列をコンテキスト文字列として指定する場合、OMG CORBA仕様では、先頭に英文字を使用した文字列からなるカンマ区切りのリストが必要です。

ノート:

上記の例はOMG CORBAに準拠していませんが、Oracle Tuxedoソフトウェアによってユーザーの意図したとおりに処理されます。
制約 OMG IDLコンテキスト文字列でワイルドカードを使用すると、警告メッセージが表示されます。
  説明 ワイルドカード文字を含むコンテキスト文字列を操作の定義で使用した場合、C++ IDLコンパイラによって警告メッセージが表示されます。コンテキスト文字列をOMG IDL操作定義で指定すると、次の警告メッセージが表示される場合があります:
void op5() context("*");
                    ^
LIBORBCMD_CAT:131: INFO: ‘*’ is a non-standard
context property.
  回避策 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」を使用して定義されます。