言語が混在したプログラミングにおける呼び出し規約の調整

呼び出し規約は,プログラムがルーチンをどのように呼び出すのか,引数がどのように渡されるのか,そしてルーチンの名前がどのように指定されるのか (「言語が混在したプログラミングにおける名付け規約の調整」で説明しています) を決定します。単一言語のプログラムでは,すべてのルーチンで基本設定が 1 つしかなく,インタフェース宣言を含んでいるヘッダ・ファイルと Fortran モジュール・ファイルが呼び出し側と呼び出される側のルーチン間で一貫性を実現するので,呼び出し規約はほぼつねに正しくなります。

言語が混在したプログラムでは,異なる言語が同じヘッダ・ファイルを共有することはできません。このため,異なる呼び出し規約を使用する Fortran と C のルーチンをリンクすると,そのエラーは実行時に不正な呼び出しが行われるまでは表面化しません。実行時の不正な呼び出しは,一般にプログラム中の実際の原因 (呼び出しエラーのためのメモリーやスタックの破壊) とは関係のなさそうな場所で,誤った結果や致命的なエラーを引き起こします。このため,個々の言語が混在した呼び出しについて,その呼び出し規約を慎重に検証する必要があります。

言語間の呼び出し規約についての説明は,外部手続にのみ適用されます。内部手続を,それを含んでいるプログラム単位の外から呼び出すことはできません。

呼び出し規約は,プログラミングに次の 5 つの形で影響を与えます。

  1. 呼び出し側ルーチンは,呼び出し規約を使って別のルーチンに引数を渡す順序を決定します。呼び出されたルーチンは,呼び出し規約を使って,渡された引数を受け取る順序を決定します。Fortran では,言語が混在したインタフェース中で INTERFACE 文を使うか,データまたは関数宣言中で指定することによって,これらの規約を指定することができます。32 ビットの Visual C/C++ と Fortran は,どちらも引数を左から右の順序で渡します。

  2. 呼び出し側ルーチンと呼び出されたルーチンは,呼び出し規約を使って呼び出されたルーチンが実行を完了したときに,引数を除去するためにスタックの調節を行う責任をどちらが負うかを決定します。これらの規約は,CSTDCALL などの ATTRIBUTES (cDEC$ ATTRIBUTES コンパイラ指示文) オプションで指定することができます。

  3. 呼び出し側ルーチンと呼び出されたルーチンは,呼び出し規約を使って可変個の引数を渡すときのオプションを選択します。

  4. 呼び出し側ルーチンと呼び出されたルーチンは,呼び出し規約を使って引数を値で (値渡し),または参照で (アドレス渡し) 渡します。個々の Fortran 引数を ATTRIBUTES オプションの VALUE または REFERENCE で指定することもできます。

  5. 呼び出し側ルーチンと呼び出されたルーチンは,呼び出し規約を使って手続名の名付け規約を設定します。ALIAS 命令 (または ATTRIBUTES オプション の ALIAS) を使うと,Fortran での名前とは関係なく,任意の手続名を設定することができます。C では大文字小文字が区別されるのに対し,Fortran では区別されないので,この機能は有用です。

次に示す節では,呼び出し規約に関する具体的な問題について説明しています。