C/400

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 では是非、利用することを
お奨めしたい。