C/400

47. 明示的な外部プログラムの呼び出し

C/400 から外部プログラムを呼び出して実行するには linkage を使って

#pragma map(MyPGM, "MYPGM     ")
#pragma linkage(MyPGM, OS)           
void  MyPGM(void);          
    :
  MyPGM();   /* 外部プログラムの実行 */

のようにして実行する。
しかし、上記の記述では外部プログラム : MYPGM はライブラリー・リスト上の
どこかのライブラリーに存在していなければならない。
C/400 解説書には次のように書かれている。

外部プログラムの名前を指定します。
#PRAGMAマップ指示ステートメントが OS400プログラムの命名規則に併せて
指定されていないときは、この名前を10文字以内の大文字で指定しなければなりません。
指定されたプログラム名が長すぎるときは切り捨てられます。
#PRAGMA連携処理中は 255文字より長い文字は 255文字に切り捨てられます。
255文字までの文字に切り捨てられた名前で #PROGMAマップを指定してください。

かなり意味不明の解説である。
筆者は長い間前述の指定を使用していて C/400 ではライブラリー名の指定が
できないものと思い込んでいた。
しかしユーザー・プログラムがライブラリー・リストを変更している場合には
弊社製品のライブラリーがライブラリー・リストから除去されてしまうために
実行時のエラーが発生する事態に出くわしてしまった。
そこで「OS400プログラムの命名規則」というくだりに注目して
ライブラリー/プログラム名 の形式を使って

#pragma map(MyPGM, "MYLIB/MYPGM")
#pragma linkage(MyPGM, OS)           
void  MyPGM(void);   

のように変更したところ、あっさり正常に動作した。
このように

#pragma map(<関数名>, "<ライブラリー名>/<プログラム名>")

の形式で記述するとライブラリー・リストに左右されることなく明示的に
外部プログラムを呼び出すことができるようになる。
これを早速すべてのプログラム・ソースに反映させることによって
製品の品質を高めることができるようになった。