サービス・プログラム(*SRVPGM) で上位のプログラム等に公開 (EXPORT) できるのは
プロシージャーばかりではない。
プロシージャーとは Windowsで言うところのメソッドに相当するものであるから、
プロパティに相当する EXPORT 変数も利用することができる。
上位のプログラムが、下位のサービス・プログラム(*SRVPGM)が算出した変数を
参照したいときにいちいちその変数の値を取得するためのプロシージャーを用意していたのでは、
大変であるし、何よりスマートではない。
C/400 で書かれたサービス・プログラム(*SRVPGM)も単に公開した変数はグローバル定義で
/*************************************************************/ /* EXPORT 変 数 */ /*************************************************************/ int ASCII_SHIFT = TRUE; int EBCDIC_SHIFT = FALSE;
のように定義しておいてから、QSRVSRC 上で
EXPORT SYMBOL("ASCII_SHIFT") EXPORT SYMBOL("EBCDIC_SHIFT")
のようにシンボルとして定義してコンパイルしてから、DSPSRVPGM で眺めてみると
データのエクスポート : ASCII_SHIFT EBCDIC_SHIFT
と表示されているはずである。
そこで上位の C/400 で、これらの変数を使用したいときに、これらの変数をどのように
定義すればよいだろうか ?
単純に、
int ASCII_SHIFT; int EBCDIC_SHIFT;
と定義したのでは、CRTCMOD コンパイルは成功したとしても、CRTPGM ビルドでは
CPD5D03 :記号 'ASCII_SHIFT' の定義が複数回指定された。 CPD5D03 :記号 'EBCDIC_SHIFT' の定義が複数回指定された。
のエラーが発生して、当然のことながら二重定義としてビルドは成功しない。
しかし上記の定義がなければ CRTCMOD のコンパイル・エラーとなってしまう。
さて、これらの変数はどのように定義すればよいのだろうか ?
このことについては C/400 解説書には、どこにも解説されていない。
答えとしては extern を使って、
extern int ASCII_SHIFT; extern int EBCDIC_SHIFT;
として定義すればコンパイル、ビルドともに成功する。
EXPORT 変数の利用はスマートで便利であるので ILE C/400 では是非、利用することを
お奨めしたい。