COBOL のレコードの構造は、文字列配列を含む C の構造体に似ています。COBOL コンパイラがレコードを割り当てるときには、特定のハードウェア プラットフォーム向けに 2 進項目やポインター データ項目が整列されたり、 2 進 (COMP-X) データ項目のバイト オーダーが調整されたりすることはありません。その結果、COBOL アプリケーションは、異なるプラットフォーム間で優れた互換性を発揮します。ただし、複数の言語を使用する開発環境では、この互換性が問題の原因になる可能性もあります。C の構造体は COBOL のレコードに比べ定義が緩やかであり、オペレーティング システムによって構造が大きく異なります。たとえば、COBOL では次のように、構造体がどのプラットフォームでコンパイルされていても構造体の長さは 6 バイトです。
01 mystruct is typedef. 05 mystruct-key-1 pic x occurs 2. 05 mystruct-bin-1 pic x(4) comp-5.
ところが、このレコードを単純に書き直しただけでも、C の構造体は異なる結果になります。たとえば、次の例では通常、32 ビット オペレーティング システムでは 8 バイト、64 ビット オペレーティング システムでは 16 バイトのサイズの構造体になります。整列によるパディングが施されるためです。
struct mystruct { char mystruct_key_1[2]; long mystruct_bin_1; };
互換性があるため、より良い解決策は、次のように C 構造を使用して COBOL レコード mystruct を表現することです。
struct mystruct { char mystruct_key_1[2]; char mystruct_bin_1[4]; };
混合言語アプリケーション用に COBOL データ レコードを C データ型に変換できるように、C インクルード ファイルが用意されています。このファイル cbltypes.h は、%ProgramFiles(x86)%\Micro Focus\Enterprise Developer\include にあります。これには、COBOL アプリケーションおよび CBL_ ライブラリ ルーチンのインターフェイスで使用される基本的なデータ型の多くが含まれています。これらの型は、デフォルトで %ProgramFiles(x86)%\Micro Focus\Enterprise Developer\cpylib にあるコピーブック cbltypes.cpy に含まれている型に直接対応しています。
上記の例で、次の COBOL レコード配置は、
01 mystruct is typedef. 05 mystruct-key-1 cblt_x1 occurs 2. *> aka. "PIC X" 05 mystruct-bin-1 cblt_x4_comp5. *> aka. # "PIC X(4) COMP-5"
cbltypes.h を使用して、次のように C で正しく表すことができます。
#include "cbltypes.h" struct mystruct { cbl_x1_t mystruct_key_1[2]; cbl_x4_comp5_t mystruct_bin_1; };
cbltypes.h で使用される型名変換は、対応する COBOL 型定義の PICTURE 文字列を反映したものです。同ファイル内で定義されている基本的なデータ型を次に示します。
cbl_x1_t cobol character position - basis for all types cbl_pointer_t Equivalent to: USAGE POINTER cbl_ppointer_t Equivalent to: USAGE PROCEDURE-POINTER cbl_sx1_comp5_t Equivalent to: PIC s9(n) COMP-5 where n=1 or 2 cbl_sx2_comp5_t Equivalent to: PIC s9(n) COMP-5 where n=3 or 4 cbl_sx4_comp5_t Equivalent to: PIC s9(n) COMP-5 where n=7 through 9 cbl_sx8_comp5_t Equivalent to: PIC s9(18) COMP-5 cbl_x1_comp5_t Equivalent to: PIC X(1) COMP-5 cbl_x2_comp5_t Equivalent to: PIC X(2) COMP-5 cbl_x4_comp5_t Equivalent to: PIC X(4) COMP-5 cbl_x8_comp5_t Equivalent to: PIC X(8) COMP-5 cbl_x1_compx_t Equivalent to: PIC X(1) COMP-X cbl_x2_compx_t Equivalent to: PIC X(2) COMP-X cbl_x4_compx_t Equivalent to: PIC X(4) COMP-X cbl_x8_compx_t Equivalent to: PIC X(8) COMP-X
COBOL のデータ型に相当する型を使用すれば、COBOL 側とのデータの互換性は維持できます。ただし、これらのデータは C のコード内で処理する必要があります。これを可能にするために、C ライブラリ ルーチンが提供されています。これらのルーチンを使用すると、多くの COBOL ベースのデータ型を C アプリケーション コンポーネントのコンテキストでの使用に適した形式に変換できます。