Visual C/C++ と Visual Basic は,シンボル表中で大文字と小文字の違いを保存しますが,Fortran は基本設定では保存しません。この違いには注意を払う必要があります。幸いなことに,Fortran ATTRIBUTES コンパイラ指示文の ALIAS オプションを使うと,名前の食い違いを解消したり,大文字小文字の違いを保存したり,Fortran が基本設定で行う名前の大文字への変換を置換したり,Fortran の STDCALL と C の名付け規約が行う小文字への変換を置換したりすることができます。
Visual C++ は,C と同じ呼び出し規約と引数渡しの技術を使用しますが,名付け規約に関しては,Visual C++ の外部シンボルの修飾のために違いがあります。C++ のコードが .cpp ファイル (ビジュアル開発環境で C/C++ のファイルを選択したときに作成されます) に含まれていると,外部名には C++ の名前修飾セマンティクスが適用され,一般にリンカー・エラーが発生します。extern "C" の構文を使うと,Visual C++ は名前の修飾を行わないので,Visual C++ モジュールは他の言語とデータおよびルーチンを共有することができます。
次の例は,prn を C 名付け規約を使って外部関数として宣言しています。この宣言は Visual C++ のソース・コードからとったものです。
extern "C" { void prn(); }
Fortran で書かれた関数を呼び出すには,関数を C と同じように宣言し,リンケージ指定として "C" を使用します。たとえば,Visual C++ から Fortran 関数 FACT を呼び出すには,次のように宣言します。
extern "C" { int __stdcall FACT( int n ); }
extern "C" の構文を使うと,Visual C++ から他の言語への呼び出しを調整したり,他の言語から呼び出される Visual C++ ルーチンの名付け規約を変更することができます。ただし,extern "C" は Visual C++ からしか使用できません。Visual C++ コードが extern "C" を使用しておらず,変更することもできない場合,名前の修飾を判断し,他の言語から生成することしか Visual C++ ルーチンを呼び出す手段はありません。修飾方式がバージョン間で変わらないという保証はないので,このようなアプローチは最後の手段としてのみ使用するようにしてください。
extern "C" の使用にはいくつかの制約があります。
extern "C" でメンバ関数を宣言することはできません。
extern "C" は,オーバーロードされた関数の 1 つのインスタンスでしか指定できません。オーバーロードされた関数の他の全インスタンスは Visual C++ のリンケージを持ちます。
extern "C" のリンケージ指定についての詳細は,『Microsoft Visual C++ Language Reference』を参照してください。