/Gd、/Gr、/Gz (呼び出し規約)
これらのオプションでは、関数の引数をスタックにプッシュする順序、呼び出し元と呼び出し先のどちらの関数が呼び出しの最後にスタックから引数を削除するか、および個々の関数を識別するためにコンパイラが使用する名前装飾規約を決定します。
/Gd
/Gr
/Gz
解説
注意
これらのコンパイラ オプションは、x86 に対応するコンパイラでのみ使用できます。x64 や Itanium に対応するコンパイラでは使用できません。
/Gd は、C++ メンバー関数ではない関数、または __stdcall や __fastcall が指定されていない関数の __cdecl 呼び出し規約を指定します。これは既定の設定です。
/Gr は、__fastcall 呼び出し規約を指定します。ただし、C++ メンバー関数、または __cdecl や __stdcall が指定されている関数に対しては指定できません。 すべての __fastcall 関数には、プロトタイプ宣言が必要です。
/Gz は、__stdcall 呼び出し規約を指定します。ただし、C++ メンバー関数、または __cdecl や __fastcall が指定されている関数に対しては指定できません。 すべての __stdcall 関数には、プロトタイプ宣言が必要です。
可変数の引数を受け取る関数には __cdecl が指定されている必要があります。
/Gd、/Gr、および /Gz は、/clr:safe または /clr:pure と互換性がありません。
注意
x86 プロセッサの場合、既定では、C++ メンバー関数は __thiscall を使用します。
すべてのプロセッサで、__cdecl、__fastcall、__stdcall のいずれかとして明示的に指定されているメンバー関数では、指定の呼び出し規約が使用されます。 可変個の引数を取るメンバー関数では、常に __cdecl 呼び出し規約が使われます。
__cdecl の場合
C の __cdecl 名前付け規則では、関数名の前にアンダースコア (_) が付けられ、大文字小文字は変換されません。 C++ の関数では、extern "C" として宣言しない限り、別の名前装飾規約が使われます。 詳細については、「装飾名」を参照してください。
__fastcall の場合
__fastcall 関数の一部の引数はレジスタ (x86 プロセッサの場合 ECX および EDX) で渡され、その他の引数は右から左の順にスタックにプッシュされます。 これらの引数は、呼び出し元に制御が戻る前に、呼び出し先のルーチンによってスタックからポップされます。 通常、/Gr オプションを使用すると実行速度が上がります。
注意
インライン アセンブリ言語で記述された関数に対して __fastcall 呼び出し規約を使用する場合は注意してください。 レジスタを使用すると、コンパイラ側で使用するレジスタと競合する場合があります。
C の __fastcall 名前付け規則では、関数名の前にアット マーク (@) を付け、その後ろに関数の引数の大きさをバイト数で示します。 大文字と小文字は変換されません。 コンパイラでは、次の名前付け規則用テンプレートを使用します。
@function_name@number
__fastcall 名前付け規則を使う場合は、標準のインクルード ファイルを使用してください。 使用しないと、外部参照が解決されません。
__stdcall の場合
__stdcall 関数の引数は、右から左の順序でスタックにプッシュされます。これらの引数は、呼び出し元に制御が戻る前に、呼び出し先の関数によってポップされます。
C の __stdcall 名前付け規則では、関数名の前にアンダースコア (_) を付け、関数名の最後にアット マーク (@) を付けます。このアット マーク (@) の後ろに、関数の引数の大きさをバイト数で示します。 大文字小文字は変換されません。 コンパイラでは、次の名前付け規則用テンプレートを使用します。
_functionname@number
x86 固有の仕様→
このオプションを指定しても、C++ のメソッドや関数の名前装飾規約には影響しません。 C++ のメソッドや関数では、extern "C" として宣言しない限り、別の名前装飾規約が使用されます。 詳細については、「装飾名」を参照してください。
呼び出し規約の詳細については、「Calling Conventions」を参照してください。
← x86 固有の仕様
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダーをクリックします。
[詳細] プロパティ ページをクリックします。
[呼び出し規約] プロパティを変更します。
このコンパイラ オプションをコードから設定するには
- CallingConvention を参照してください。