/Gd, /Gr, /Gv, /Gz(호출 규칙)/Gd, /Gr, /Gv, /Gz (Calling Convention)

이 옵션들은 스택 위로 푸시되는 순서, 호출자 함수 또는 호출된 함수가 호출이 끝나면 스택에서 인수를 제거하는지 여부, 그리고 컴파일러가 개별 함수를 식별하는 데 사용하는 식별 이름 데코레이션 규칙을 결정합니다.These options determine the order in which function arguments are pushed onto the stack, whether the caller function or called function removes the arguments from the stack at the end of the call, and the name-decorating convention that the compiler uses to identify individual functions.

구문Syntax

/Gd
/Gr
/Gv
/Gz

설명Remarks

/Gd 기본 설정인는 c + + 멤버 함수 및 __stdcall, __fastcall또는 __vectorcall로 표시 된 함수를 제외한 모든 함수에 대 한 __cdecl 호출 규칙을 지정 합니다./Gd, the default setting, specifies the __cdecl calling convention for all functions except C++ member functions and functions that are marked __stdcall, __fastcall, or __vectorcall.

/Gr****__fastcall c + + 멤버 함수, 이라는 함수 main 및, 또는로 표시 된 함수를 제외한 모든 함수에 대해 호출 규칙을 지정 합니다 __cdecl __stdcall __vectorcall ./Gr specifies the __fastcall calling convention for all functions except C++ member functions, functions named main, and functions that are marked __cdecl, __stdcall, or __vectorcall. 모든 __fastcall 함수에는 프로토타입이 있어야 합니다.All __fastcall functions must have prototypes. 이 호출 규칙은 x86을 대상으로 하는 컴파일러에서만 사용할 수 있으며 다른 아키텍처를 대상으로 하는 컴파일러에서는 무시됩니다.This calling convention is only available in compilers that target x86, and is ignored by compilers that target other architectures.

/Gz****__stdcall c + + 멤버 함수, 이라는 함수 main 및, 또는로 표시 된 함수를 제외한 모든 함수에 대해 호출 규칙을 지정 합니다 __cdecl __fastcall __vectorcall ./Gz specifies the __stdcall calling convention for all functions except C++ member functions, functions named main, and functions that are marked __cdecl, __fastcall, or __vectorcall. 모든 __stdcall 함수에는 프로토타입이 있어야 합니다.All __stdcall functions must have prototypes. 이 호출 규칙은 x86을 대상으로 하는 컴파일러에서만 사용할 수 있으며 다른 아키텍처를 대상으로 하는 컴파일러에서는 무시됩니다.This calling convention is only available in compilers that target x86, and is ignored by compilers that target other architectures.

/Gv****__vectorcall c + + 멤버 함수, 명명 된 함수 main , 변수 인수 목록을 사용 하는 함수 vararg 또는 충돌 __cdecl , __stdcall 또는 특성으로 표시 __fastcall 된 함수를 제외한 모든 함수에 대해 호출 규칙을 지정 합니다./Gv specifies the __vectorcall calling convention for all functions except C++ member functions, functions named main, functions with a vararg variable argument list, or functions that are marked with a conflicting __cdecl, __stdcall, or __fastcall attribute. 이 호출 규칙은 /arch:SSE2 이상을 지원하는 x86 및 x64 아키텍처에서만 사용할 수 있으며 ARM 아키텍처를 대상으로 하는 컴파일러에서는 무시됩니다.This calling convention is only available on x86 and x64 architectures that support /arch:SSE2 and above, and is ignored by compilers that target the ARM architecture.

가변적인 개수의 인수를 사용 하는 함수는로 표시 되어야 합니다 __cdecl .Functions that take a variable number of arguments must be marked __cdecl.

/Gd, /Gr /Gv/Gz/clr:safe 또는 /clr: pure 와 호환 되지 않습니다./Gd, /Gr, /Gv and /Gz are not compatible with /clr:safe or /clr:pure. /clr:pure/clr:safe 컴파일러 옵션은 Visual Studio 2015에서는 더 이상 사용되지 않으며 Visual Studio 2017 이상에서는 지원되지 않습니다.The /clr:pure and /clr:safe compiler options are deprecated in Visual Studio 2015 and unsupported in Visual Studio 2017 and later.

참고

X86 프로세서의 경우 기본적으로 c + + 멤버 함수는를 사용 __thiscall 합니다.By default for x86 processors, C++ member functions use __thiscall.

모든 프로세서에 대해,, 또는로 명시적으로 표시 된 멤버 함수는 __cdecl __fastcall __vectorcall __stdcall 해당 아키텍처에서 무시 되지 않는 경우 지정 된 호출 규칙을 사용 합니다.For all processors, a member function that is explicitly marked as __cdecl, __fastcall, __vectorcall, or __stdcall uses the specified calling convention if it is not ignored on that architecture. 가변적인 개수의 인수를 사용 하는 멤버 함수는 항상 호출 규칙을 사용 합니다 __cdecl .A member function that takes a variable number of arguments always uses the __cdecl calling convention.

이러한 컴파일러 옵션은 C++ 메서드 및 함수의 이름 데코레이션에는 영향을 주지 않습니다.These compiler options have no effect on the name decoration of C++ methods and functions. extern "C"로 선언되지 않은 한 C++ 메서드와 함수는 다른 이름 데코레이션 구성표를 사용합니다.Unless declared as extern "C", C++ methods and functions use a different name-decorating scheme. 자세한 내용은 데코레이트된 이름을 참조합니다.For more information, see Decorated Names.

호출 규칙에 대한 자세한 내용은 호출 규칙을 참조합니다.For more information about calling conventions, see Calling Conventions.

__cdecl 특성__cdecl Specifics

x86 프로세서에서 모든 함수 인수는 오른쪽에서 왼쪽으로 스택에 전달됩니다.On x86 processors, all function arguments are passed on the stack from right to left. ARM 및 x64 아키텍처에서 일부 인수는 레지스터로 전달되고 나머지는 스택에서 오른쪽에서 왼쪽으로 전달됩니다.On ARM and x64 architectures, some arguments are passed by register and the rest are passed on the stack from right to left. 호출 루틴은 스택에서 인수를 팝합니다.The calling routine pops the arguments from the stack.

C의 경우 __cdecl 명명 규칙은 앞에 밑줄 ()이 오는 함수 이름을 사용 하 _ 고, 대/소문자 변환은 수행 되지 않습니다.For C, the __cdecl naming convention uses the function name preceded by an underscore ( _ ); no case translation is performed. extern "C"로 선언되지 않은 한 C++ 함수는 다른 이름 데코레이션 구성표를 사용합니다.Unless declared as extern "C", C++ functions use a different name-decorating scheme. 자세한 내용은 데코레이트된 이름을 참조합니다.For more information, see Decorated Names.

__fastcall 특성__fastcall Specifics

일부 __fastcall 함수의 인수는 레지스터에 전달 되 고 (x86 프로세서, ECX 및 EDX) 나머지는 오른쪽에서 왼쪽으로 스택에 푸시됩니다.Some of a __fastcall function's arguments are passed in registers (for x86 processors, ECX, and EDX), and the rest are pushed onto the stack from right to left. 호출된 루틴은 반환하기 전에 스택에서 이러한 인수를 팝합니다.The called routine pops these arguments from the stack before it returns. 일반적으로 /Gr 은 실행 시간을 줄입니다.Typically, /Gr decreases execution time.

참고

__fastcall 인라인 어셈블리 언어로 작성 된 모든 함수에 대해 호출 규칙을 사용할 때는 주의 해야 합니다.Be careful when you use the __fastcall calling convention for any function that's written in inline assembly language. 레지스터 사용이 컴파일러의 사용과 충돌할 수 있습니다.Your use of registers could conflict with the compiler's use.

C의 경우 __fastcall 명명 규칙은 앞에 at 기호 ( @ ) 뒤에 함수 인수의 크기 (바이트)가 오는 함수 이름을 사용 합니다.For C, the __fastcall naming convention uses the function name preceded by an at sign (@) followed by the size of the function's arguments in bytes. 대/소문자 변환은 수행되지 않습니다.No case translation is done. 컴파일러는 이 템플릿을 명명 규칙에 사용합니다.The compiler uses this template for the naming convention:

@function_name@number

명명 규칙을 사용 하는 경우 __fastcall 표준 포함 파일을 사용 합니다.When you use the __fastcall naming convention, use the standard include files. 그렇지 않으면 해결되지 않은 외부 참조가 표시됩니다.Otherwise, you will get unresolved external references.

__stdcall 특성__stdcall Specifics

__stdcall 함수의 인수는 오른쪽에서 왼쪽으로 스택에 푸시되 고, 호출 된 함수는 반환 되기 전에 스택에서 이러한 인수를 팝 합니다.A __stdcall function's arguments are pushed onto the stack from right to left, and the called function pops these arguments from the stack before it returns.

C의 경우 __stdcall 명명 규칙은 앞에 밑줄 ( _ )이 오고 그 뒤에 () 기호 ( @ )와 함수의 인수 크기 (바이트)를 차례로 사용 합니다.For C, the __stdcall naming convention uses the function name preceded by an underscore (_) and followed by an at sign (@) and the size of the function's arguments in bytes. 대/소문자 변환은 수행되지 않습니다.No case translation is performed. 컴파일러는 이 템플릿을 명명 규칙에 사용합니다.The compiler uses this template for the naming convention:

_functionname@number

__vectorcall 특성__vectorcall Specifics

__vectorcall 함수의 정수 인수는 값으로 전달 되 고, 최대 2 (x 86) 또는 4 (x64) 정수 레지스터를 사용 하 고, 부동 소수점 및 벡터 값의 경우 최대 6 개의 XMM 레지스터를 사용 하 고, 나머지는 오른쪽에서 왼쪽으로 스택에 전달 됩니다.A __vectorcall function's integer arguments are passed by value, using up to two (on x86) or four (on x64) integer registers, and up to six XMM registers for floating-point and vector values, and the rest are passed on the stack from right to left. 호출된 함수는 반환하기 전에 스택을 정리합니다.The called function cleans off the stack before it returns. 벡터 및 부동 소수점 반환 값은 XMM0으로 반환됩니다.Vector and floating-point return values are returned in XMM0.

C의 경우 __vectorcall 명명 규칙은 함수 이름 뒤에 두 개의 at 기호 ( @@ )를 사용 하 고 함수 인수의 크기 (바이트)를 사용 합니다.For C, the __vectorcall naming convention uses the function name followed by two at signs (@@) and the size of the function's arguments in bytes. 대/소문자 변환은 수행되지 않습니다.No case translation is performed. 컴파일러는 이 템플릿을 명명 규칙에 사용합니다.The compiler uses this template for the naming convention:

functionname@@number

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면To set this compiler option in the Visual Studio development environment

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다.Open the project's Property Pages dialog box. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조합니다.For details, see Set C++ compiler and build properties in Visual Studio.

  2. C/c + + > 고급 속성 페이지를 선택 합니다.Select the C/C++ > Advanced property page.

  3. 호출 규칙 속성을 수정합니다.Modify the Calling Convention property.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면To set this compiler option programmatically

참고 항목See also