C400

50. C/400 でEXPORT された変数を使用するには ?

サービス・プログラム(*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 では是非、利用することを

お奨めしたい。