19.1.4 注意事項
C言語の構造体の場合,要素の境界調整でパディング(領域間のギャップを埋めるために挿入される暗黙のFILLER項目)が挿入されます。そのほかに,構造体のサイズを最大の基本要素サイズの倍数に切り上げるため,パディングが挿入されることがあります。この場合,パディングは構造体の末尾に挿入されます。例えば上記の例の構造体tblの場合,要素の合計のサイズはCOBOLの集団項目TBLと同じ14バイトですが,構造体のサイズを4バイト(最大の基本要素のサイズ)の倍数の16バイトにするために,2バイトのパディングが構造体の末尾に挿入されます。このため,COBOLの集団項目TBLとはサイズが不一致になります。プラットフォームによっては,このサイズの不一致が原因で,引数や戻り値の受け渡しで異常終了や結果不正となることがあるため,次のどちらかの方法でC言語の構造体のサイズとCOBOLの集団項目のサイズを一致させる必要があります。
-
C言語の構造体のサイズをCOBOLの集団項目のサイズに合わせる方法
構造体を詰めて配置するC言語の機能(C言語の言語仕様の#pragma packやC言語のコンパイラのコンパイラオプションで提供されている)を使って構造体tblのサイズを14バイトにします。構造体を詰めて配置するC言語の機能については,各システムのCコンパイラのリファレンスを参照してください。
-
COBOLの集団項目のサイズをC言語の構造体のサイズに合わせる方法
COBOLの集団項目TBLのサイズを16バイトにするために,COBOLの集団項目TBLの末尾に次の2バイト分のFILLER項目を追加してください。
02 FILLER PIC X(2).
C言語のシステム関数※は,#defineによって実際の関数名とは別の関数名で宣言され,マクロ展開後に置き換えられることがあります。COBOLではC言語のマクロは展開しないため,COBOLプログラムからC言語のシステム関数をCALL文で直接呼び出すと,COBOLからマクロ展開前の関数名を呼び出し,予期せぬ不具合が発生するおそれがあります。
COBOLプログラムからC言語のシステム関数を呼び出す場合は,直接呼び出さないで,システム関数を呼び出すCプログラムを作成し,このCプログラムを呼び出すようにしてください。
- 注※
-
Microsoft C/C++の関数