共用方式為


/Gd, /Gr, /Gv, /Gz (呼叫慣例)

這些選項會決定將函式引數推入堆疊的順序、呼叫端函式或呼叫的函式是否會在呼叫結尾從堆疊中移除引數,以及編譯器用來識別個別函式的名稱裝飾慣例。

語法

/Gd
/Gr
/Gv
/Gz

備註

/Gd,預設設定會 針對所有標示 為__stdcall __fastcall或 __vectorcall 的 C++ 成員函式和函式,指定__cdecl 呼叫慣例。

/Gr__fastcall 指定所有函式的呼叫慣例,但 C++ 成員函式、名為 main 的函式和標示 __cdecl 為 、 __stdcall__vectorcall 的函式除外。 所有 __fastcall 函式都必須有原型。 此呼叫慣例僅供以 x86 為目標的編譯器使用,以其他架構為目標的編譯器會忽略此呼叫慣例。

/Gz__stdcall 指定所有函式的呼叫慣例,但 C++ 成員函式、名為 main 的函式和標示 __cdecl 為 、 __fastcall__vectorcall 的函式除外。 所有 __stdcall 函式都必須有原型。 此呼叫慣例僅供以 x86 為目標的編譯器使用,以其他架構為目標的編譯器會忽略此呼叫慣例。

/Gv__vectorcall 指定所有函式的呼叫慣例,但 C++ 成員函式、名為 main 的函式、具有 vararg 變數引數清單的函式,或以衝突 __cdecl__stdcall__fastcall 屬性標示的函式。 此呼叫慣例只可用在支援 /arch:SSE2 及更新版本的 x86 和 x64 架構上,以 ARM 架構為目標的編譯器會忽略此呼叫慣例。

函式若接受可變數目的引數,則必須標示為 __cdecl

/Gd/Gr/Gv/Gz 與 或 /clr:pure 不相容 /clr:safe/clr:pure/clr:safe 編譯器選項在 Visual Studio 2015 中已被取代,而且無法在 Visual Studio 2017 及更新版本中使用。

注意

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

針對所有處理器,明確標示為 __cdecl__fastcall__vectorcall__stdcall 的成員函式會使用指定的呼叫慣例,但前提是此慣例不會在該架構上遭到忽略。 若成員函式接受可變數目的引數,則一律會使用 __cdecl 呼叫慣例。

這些編譯器選項不影響 C++ 方法和函式的名稱裝飾。 除非宣告為 extern "C",否則 C++方法和函式會使用不同的名稱裝飾配置。 如需詳細資訊,請參閱裝飾名稱

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

__cdecl 特性

在 x86 處理器上,所有函式引數會都由右至左地傳遞到堆疊上。 在 ARM 和 x64 架構上,部分引數會由暫存器傳遞,其餘部分會由右至左地傳遞到堆疊上。 呼叫常式會從堆疊取出引數。

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

__fastcall 特性

__fastcall 函式的某些引數會傳入暫存器 (適用於 x86 處理器、ECX 和 EDX),而其餘部分會由右至左地推入堆疊。 所呼叫的常式會在堆疊傳回之前,從堆疊中取出這些引數。 通常,/Gr 會縮短執行時間。

注意

當您對以內嵌組件語言所撰寫的任何函式使用 __fastcall 呼叫慣例時,應格外小心。 暫存器的使用可能會與編譯器的使用發生衝突。

對於 C 語言,__fastcall 命名慣例會使用前面加上 at 符號 (@) 的函式名稱,而後面會接著以位元組為單位的函式引數大小。 不會執行大小寫轉譯。 編譯器會使用此範本作為命名慣例:

@function_name@number

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

__stdcall 特性

__stdcall 函式的引數會從右至左地推送到堆疊上,而所呼叫的常式會在堆疊傳回之前,從堆疊中取出這些引數。

針對 C,命名慣例會 __stdcall 使用前面加上底線 ( _ ) 的函式名稱,後面接著 at 符號 ( @ ) 和函式引數的大小,以位元組為單位。 不會執行大小寫轉譯。 編譯器會使用此範本作為命名慣例:

_functionname@number

__vectorcall 特性

__vectorcall 式的整數引數會以值傳遞,最多使用兩個(在 x86 上)或四個(在 x64 上)整數暫存器,以及最多六個 XMM 暫存器用於浮點和向量值,其餘則從右至左傳遞在堆疊上。 所呼叫的函式會在堆疊傳回前,將其清除。 向量和浮點會傳回在 XMM0 中傳回的值。

對於 C 語言,__vectorcall 命名慣例會使用後面加上兩個 at 符號 (@@) 的函式名稱,且後方還會加上以位元組為單位的函式引數大小。 不會執行大小寫轉譯。 編譯器會使用此範本作為命名慣例:

functionname@@number

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

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [ 組態屬性 > C/C++ > 進階 ] 屬性頁。

  3. 修改呼叫慣例屬性。

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

另請參閱