/Gd、/Gr、/Gz (呼叫慣例)
更新:2007 年 11 月
這些選項決定函式引數推入至堆疊上的順序;不管是呼叫端函式或是被呼叫的函式在呼叫結束時從堆疊移除引數;以及編譯器用來辨認各個函式的名稱裝飾慣例。
/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 開發環境中設定這個編譯器選項
開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱 HOW TO:開啟專案屬性頁。
按一下 [C/C++] 資料夾。
按一下 [進階] 屬性頁。
修改 [呼叫慣例] 屬性。
若要以程式方式設定這個編譯器選項
- 請參閱 CallingConvention。