インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
デフォルトでは、Fortran コンパイラーは関数名とサブプログラム名を、Linux* および macOS* の場合は小文字に、Windows* の場合は大文字に変換します。しかし、C コンパイラーは大文字と小文字の変換を行いません。このため、Fortran プログラムから呼び出される C プロシージャーには、大文字と小文字を正確に使用して名前を付けなければなりません。
C++ は、C と同じ呼び出し規約と引数渡しの手法を使用しますが、命名規則に関しては、C++ の外部シンボルの修飾のために違いがあります。C++ のコードが .cpp ファイルに存在する場合、C++ の名前修飾セマンティクスが外部名に適用されるため、リンカーエラーが頻繁に発生します。extern "C" の構文を使用することにより、C++ モジュールは名前の修飾を行わず、他の言語とデータおよびルーチンを共有することができます。
次の例では、prn を C の命名規則を使用して外部関数として宣言しています。この宣言は C++ のソースコードでよく見られます。
extern "C" { void prn(); }
Fortran で書かれた関数を呼び出すには、関数を C と同じように宣言し、参照指定として "C" を使用します。例えば、C++ から Fortran 関数の FACT を呼び出すには、次のように宣言します。
extern "C" { int fact( int* n ); }
extern "C" 構文を使用することにより、C++ から他の言語への呼び出しを調整したり、他の言語から呼び出される C++ ルーチンの命名規則を変更することができます。ただし、extern "C" は C++ からしか使用できません。C++ コードが extern "C" を使用しておらず、コードを変更することもできない場合は、名前の修飾を判断し、他の言語から生成することしか C++ ルーチンを呼び出す手段はありません。修飾方式がバージョン間で変更されないという保証がないので、このようなアプローチは最後の手段としてのみ使用するようにしてください。
C++ プログラムで extern "C" を使用する場合は、次の制約事項を考慮してください。
extern "C" でメンバー関数を宣言することはできません。
多重定義された関数では、1 つのインスタンスに対してのみ extern "C" 構文を指定できます。多重定義された関数のその他のインスタンスは C++ の参照を持ちます。