インテル® Fortran コンパイラー 17.0 デベロッパー・ガイドおよびリファレンス
Fortran と C はどちらも多くの同じ基本データ型をサポートしますが、直接の相関性はありません。
1 つ異なるのは、Fortran には種別 (KIND) の概念があることです。C は、これらを別の型として扱います。例えば、Fortran の INTEGER 型を考えてみます。C には short int から long long int までさまざまな整数型があり、intptr_t のような専門の型もあります。 これらの型は Fortran の種別に対応しているものも対応していないものもあります。互換性のある C の各 integer 型について、ISO_C_BINDING は、等価な INTEGER 種別の種別番号を示す名前付き定数 (PARAMETER) を宣言します。
単純な C の int 型を考えてみます。 C_INT が ISO_C_BINDING で定義されている場合、この型は INTEGER(C_INT) に対応します。インテル® Fortran では、C の int は Fortran の INTEGER(4) に対応するため、値は常に 4 です。 ただし、ほかの Fortran 実装では異なる種別番号を使用する場合があります。名前付き定数を使用すると移植性が保証されます。
次に、C の intptr_t 型を考えてみます。 これはポインター (アドレス) を保持できる大きな整数です。インテル® Fortran では、32 ビット・アプリケーションをビルドする場合は INTEGER(4)、64 ビット・アプリケーションをビルドする場合は INTEGER(8) です。インテル® Fortran は、さまざまなプラットフォーム用に ISO_C_BINDING の異なるコピーを提供します。
Fortran には符号なしの整数型はないため、C の符号なし型に対する定数はありません。これらの型には互換性がありません。
C の型の「種別」が Fortran 実装でサポートされていない場合、その型に対する名前付き定数は -1 として定義され、使用するとコンパイル時にエラーになります。
同様に、REAL、COMPLEX、LOGICAL および CHARACTER に対して定義される定数もあります。REAL の場合、規格では C の long double 型が提示されます。 この型は、インテル® Fortran でサポートしているさまざまなプラットフォームの、さまざまな C コンパイラーにより、異なる方法で実装されています。
gcc (32 ビット Linux*): long double は、X87 命令セットでサポートされている、80 ビットの浮動小数点型です。 インテル® Fortran はこの型をサポートしていないため、C_LONG_DOUBLE は -1 です。
gcc (OS X*): C_LONG_DOUBLE は、インテル® Fortran のデータ型 REAL(16) と同じ 128 ビット型として定義されます。
64 ビット Linux* および Windows®: long double は double と同じように処理されるため、C_LONG_DOUBLE は 8 です。
確実に一致させるには、種別値の定数と C の対応する型を使用していることを確認してください。
LOGICAL および CHARACTER は互換性のために特別な処理が必要です。Fortran 規格では、LOGICAL は (ISO_C_BINDING) C の _Bool 型に対応すると明記されていて、単一種別値 C_BOOL (インテル® Fortran では 1) を定義します。 インテル® Fortran はデフォルトで、C とは異なる true/false で LOGICAL をテストします。C は false にゼロ、true に非ゼロを使用しますが、インテル® Fortran は true に -1 (すべてのビットをセット)、false にゼロを使用します。C との互換性のために LOGICAL 型を使用する場合は、解釈を C 形式に変更する fpscomp[:]logicals オプションを指定してください。 standard-semantics オプションを指定した場合は自動的に含まれます。Fortran 2003 (またはそれ以降) の機能を使用する場合は常に、このオプションを指定することを推奨します。
CHARACTER については、C に文字定数はありません。代わりに、単一文字の配列があります。そのため、Fortran で同じように文字列を表す必要があります。C の char 型に対応する KIND 値、C_CHAR が定義されています。 長さ 1 の文字変数のみ互換性があります。詳細は、「プロシージャー」を参照してください。
派生型も互換性を持たせることができます。詳細および制限事項は、「派生型」を参照してください。