Share via


/Gd、/Gr、/Gz (呼叫慣例)

這些選項決定函式引數推入至堆疊上的順序;不管是呼叫端函式或是被呼叫的函式在呼叫結束時從堆疊移除引數;以及編譯器用來辨認各個函式的名稱裝飾慣例。

/Gd
/Gr
/Gz

備註

注意事項注意事項

這些編譯器選項僅供以 x86 為目標的編譯器使用;這些編譯器選項不提供以 x64 或 Itanium 為目標的編譯器使用。

除了 C++ 成員函式和標記了 __stdcall__fastcall 的函式以外,預設設定 /Gd 會指定所有函式的 __cdecl 呼叫慣例 (Calling Convention)。

除了 C++ 成員函式和標記了 __cdecl 或 __stdcall 的函式以外,/Gr 會指定所有函式的 __fastcall 呼叫慣例。 所有 __fastcall 函式都必須有原型。

除了 C++ 成員函式和標記了 __cdecl 或 __fastcall 的函式以外,/Gz 會指定所有函式的 __stdcall 呼叫慣例。 所有 __stdcall 函式必須有原型。

採用數目不定之引數的函式必須標記 __cdecl。

/Gd/Gr/Gz/clr:safe/clr:pure 不相容。

注意事項注意事項

如果是 x86 處理器,根據預設,C++ 成員函式會使用 __thiscall

對所有處理器來說,明確標記為 __cdecl、__fastcall 或 __stdcall 的成員函式會使用指定的呼叫慣例。 接受可變引數數目的成員函式永遠使用 __cdecl 呼叫慣例。

__cdecl 專屬資訊

如果是 C,__cdecl 命名慣例是使用函式名稱,前面加上底線 (_);不會執行大小寫轉譯。 除非宣告為 extern "C",否則 C++ 函式是使用另一種名稱裝飾配置。 如需詳細資訊,請參閱裝飾名稱

__fastcall 專屬資訊

有些 __fastcall 函式的引數是在暫存器中傳遞 (在 x86 處理器上有 ECX 和 EDX),其餘的則是從右至左推入到堆疊上。 被呼叫的常式會在返回前將這些引數由堆疊取出。 通常,/Gr 會縮短執行時間。

注意事項注意事項

對任何以內嵌組譯碼語言撰寫的函式使用 __fastcall 呼叫慣例時要特別留意。 您對暫存器的使用可能會與編譯器對它們的使用衝突。

如果是 C,__fastcall 命名慣例是使用函式名稱,前面加上 at 符號 (@),後面跟著以位元組為單位的函式引數大小。 不會執行大小寫轉譯。 編譯器會使用下列樣板做為命名慣例:

@function_name@number

在使用 __fastcall 命名慣例時,請使用標準包含檔。 否則您將會得到未解析的外部參考。

__stdcall 專屬資訊

__stdcall 函式的引數會由右至左推入堆疊,而且被呼叫的函式會在返回前將這些引數由堆疊取出。

如果是 C,__stdcall 命名慣例是使用函式名稱,前面加上底線 ( _ ),後面跟著 at 符號 (@) 和以位元組為單位的函式引數大小。 不會執行大小寫轉譯。 編譯器會使用下列樣板做為命名慣例:

_functionname@number

x86 專屬資訊

這個選項對 C++ 方法和函式的名稱裝飾 (Name Decoration) 沒有作用。 除非宣告為 extern "C",否則 C++ 方法和函式是使用另一種名稱裝飾配置。 如需詳細資訊,請參閱裝飾名稱

如需關於呼叫慣例的詳細資訊,請參閱Calling Conventions

x86 專屬資訊結束

若要在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁

  2. 按一下 [C/C++] 資料夾。

  3. 按一下 [進階] 屬性頁。

  4. 修改 [呼叫慣例] 屬性。

若要以程式方式設定這個編譯器選項

請參閱

參考

編譯器選項

設定編譯器選項