2024/04/24「多機能ファイラーAs/Rの魅力と活用法」を出版、KView32公開

__fastcall(変数修飾子)とは

C++Builder

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も参考にしてください。

タイトルとURLをコピーしました