C++Builderで、コンポーネント等のイベント処理の関数を追加すると関数名の前に、変数修飾子 「__fastcall」が付加されます。この「__fastcall」とは何でしょうか?通常プログラムを組む時は、特に気にする必要はないのですが、一応プログラマーとしては概要については知ってきたいところです。
これは、C++Builderで使用しているクラスライブラリ(VCL)が、元々Delphiで作られており、その呼び出しをDelphiの呼び出し規約に合わせる必要がある為です。
以下、embacaderoのヘルプからの引用です。
以下の表は、呼び出し先の関数に付けられた修飾子がどのような効果を持つかをまとめたものです。
修飾子(変数修飾子) | パラメータのプッシュ | パラメータのポップ | 名前の変更(Cのみ) |
---|---|---|---|
__cdecl | 右から左 | 呼び出し元 | ‘_’ を先頭に追加 |
__fastcall | 左から右 | 呼び出し先 | ‘@’ を先頭に追加 |
__pascal | 左から右 | 呼び出し先 | 大文字 |
__stdcall | 右から左 | 呼び出し先 | 変更なし |
上記の表で、各列は、
列 | 説明 |
---|---|
パラメータのプッシュ | 関数パラメータがスタックにプッシュされる順番を示します。 |
パラメータのポップ | 呼び出したプログラム(呼び出し元)と呼び出された関数(呼び出し先)のどちらがスタックからパラメータをポップしなければならないかを示します。 |
名前の変更(Cのみ) | グローバル関数の名前に及ぼす影響を示します。 |
を説明しています。つまり、関数呼び出し時の引数をスタックに積む順番及び、関数のリターン時のスタックのポップをどちら側で行うかが修飾子により変わります。
C++のデフォルトは、「__cdecl」となります。つまり、関数に変数修飾子が付いていないときは、「__cdecl」とになされます。
それから、Win32APIなどは「__stdcall」が使われており、DLLが提供する関数も「__stdcall」を使うのが一般的なようです。
参考URL
以下、URLも参考にしてください。