__cdecl
__cdecl
は、C および C++ プログラムの既定の呼び出し規則です。 スタックは呼び出し元によってクリーンアップされるため、vararg
関数を実行できます。 __cdecl
呼び出し規則は、各関数呼び出しにスタック クリーンアップ コードを含めるように要求するため、__stdcall よりも大きな実行可能ファイルを作成します。 次の一覧は、この呼び出し規約の実装例を示しています。 __cdecl
修飾子は Microsoft 固有です。
要素 | 実装 |
---|---|
引数を渡す順序 | 右から左。 |
スタック メンテナンスの役割 | 呼び出し元の関数によって、スタックから引数がポップされます。 |
名前装飾規約 | アンダースコア文字 (_) は、C リンケージを使用__cdecl関数がエクスポートされる場合を除き、名前の前に付けられます。 |
大文字と小文字の変換規約 | 大文字小文字は変換されません。 |
Note
関連情報については、「装飾名」を参照してください。
変数名または関数名の前に __cdecl
修飾子を置きます。 C の名前と呼び出し規則は既定であるため、__cdecl
を x86 コードで使用する必要があるのは、/Gv
(vectorcall)、/Gz
(stdcall)、または /Gr
(fastcall) コンパイラ オプションを指定したときだけです。 /Gd コンパイラ オプションは、__cdecl
呼び出し規則を強制的に適用します。
ARM と x64 のプロセッサでは、__cdecl
はコンパイラによって受け入れられますが、通常は無視されます。 ARM と x64 の規約に基づいて、引数は可能であればレジスタで渡され、残りの引数はスタックで渡されます。 x64 コードでは、__cdecl
を指定することで、/Gv コンパイラ オプションをオーバーライドし、既定の x64 呼び出し規則を使用します。
静的でないクラス関数がアウトオブラインで宣言されている場合、アウトオブラインの宣言で呼び出し規約の修飾子を指定する必要はありません。 つまり、クラスの静的でないメンバー メソッドの場合は、宣言時に指定された呼び出し規約が定義の時点で仮定されます。 次のクラス定義があるとします。
struct CMyClass {
void __cdecl mymethod();
};
ここで、
void CMyClass::mymethod() { return; }
は次の記述と同じです。
void __cdecl CMyClass::mymethod() { return; }
以前のバージョンとの互換性を確保するために、cdecl および _cdecl は、コンパイラ オプション /Za (言語拡張機能の無効化) が指定されていない限り、__cdecl
の同意語です。
例
次の例では、コンパイラは、system
関数に対して C の命名規則と呼び出し規則を使用するように指示されます。
// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示