静的ファンクションまたは内部ファンクションで使用される U_BIF マクロ

U_BIF マクロは、このマクロに渡された変数、および標準の組み込み関数パラメータ・リスト U_BIF_STANDARD_PARAMETERS からの変数の参照するようにだけ設計されています。

ただし、このような U_BIF マクトを、C プログラム内の静的もしくは内部ファンクションで利用しようとすると、明らかに問題が生じます。

例えば、自身の C プログラム内で以下のように静的/内部ファンクションを定義したとしましょう。

     static void vAverage (X_LONG lArg1, 
                     X_LONG lArg2,
                     1
{
     X_LONG lAverage;
     lAverage = (lArg1 + lArg2) / 2;
     U_BIF_SET_RET_FROM_LONG (sRetNo, lAverage);
     return;
}

このファンクションを実行するために、以下のようにコーディングします。

     vAverage (6, 42, 17);

このようにコーディングすると、コンパイルされません。

使用されている U_BIF マクロは、pX_Ids、pX_Pro などを参照します。

そして、これらはこのファンクションの「メインライン」のルーチンに渡され、スコープとなります。

ところが、この静的/内部ファンクションではこれらがスコープ外であるため、コンパイル・エラーとなってしまいます。

この問題を修正するには、以下のようにコードを変更します。

     static void vAverage (U_BIF_STANDARD_PARAMETERS,
                        X_LONG lArg1,
                        X_LONG lArg2,
                        X_SHORT sRetNo)
{
   X_LONG lAverage;
   lAverage = (lArg1 + lArg2) / 2;
   U_BIF_SET_RET_FROM_LONG (sRetNo, lAverage);
   return;
}

その後、このファンクションの実行部分を次のように変更します。

     vAverage (U_BIF_STANDARD_ARGUMENTS, 6, 42, 17);

もちろん、U_BIF マクロの中には静的または内部ファンクションで使用されると、その動作が変わるものもあります。

例えば、U_BIF_RETURN と U_BIF_ISSUE_FATAL_ERROR は、RDML ファンクションを呼び出すのではなく、呼び出し側のファンクションにコントロールを返します。

ですから、U_BIF マクロを使用する静的ファンクションまたは内部ファンクションに関しては、実行時に致命的なエラーにならないかを確認するのが良いでしょう。

ですから、先ほどの例で言えば、以下のようなコードを追加します。

     vAverage (U_BIF_STANDARD_ARGUMENTS, 6, 42, 17);
U_BIF_HANDLE_FATAL_ERROR
  • No labels