Notice : 内容無保証。禁無断転載。リンク自由。
MS-C (6.0) での引数受渡し方法には次の 3種類があります。
- (1) _cdecl (C呼びだし規約)
- MS-C でのデフォルト。
にこにこCで説明した方法。
引数を可変個にすることができる。
関数呼びだし後のスタックの調整は、呼びだし側がやる。
- (2) _pascal, _fortran (パスカル呼びだし規約)
- パスカルでの呼びだし方法。
_cdecl とは引数のつみかたが逆になる。
引数の数は可変にできない。
_cdecl より、ちょっと経済的な呼びだし方。
関数呼びだし後のスタックの調整は、呼び出された側がやる。
- (3) _fastcall (_fastcall 呼びだし規約)
- MS-C(6.0) 独自の呼びだし規約。
(可能ならば) レジスタを使い、引数を受け渡す。
レジスタに入りきらない引数については、パスカル呼びだし規約に従う。
(1)〜(3) の中で、もっとも経済的な呼びだし方法。
で、例えばパスカル呼びだし規約を使いたいときは、
int _pascal foo(int x, int y) ;
:
int _pascal foo(int x, int y) {
return x+y ;
}
の様に、関数を作成します。
ところで、MS-C (6.0)のデフォルトは (1)ですが、
そうでないコンパイラも存在します。
例えば、
- Jensen & Partners International の TopSpeed C
- エル・エス・アイ ジャパン(株) の LSI C-86
等は、デフォルトでレジスタ渡しになるようです。
TopSpeed C についての情報は、福田文紀氏より教えていただきました。(_ _)