/Gd, /Gr, /Gv, /Gz(호출 규칙)
이 옵션들은 스택 위로 푸시되는 순서, 호출자 함수 또는 호출된 함수가 호출이 끝나면 스택에서 인수를 제거하는지 여부, 그리고 컴파일러가 개별 함수를 식별하는 데 사용하는 식별 이름 데코레이션 규칙을 결정합니다.
구문
/Gd
/Gr
/Gv
/Gz
설명
/Gd
기본 설정인 C++ 멤버 함수 및 __stdcall, __fastcall 또는 __vectorcall 표시된 함수를 제외한 모든 함수에 대한 __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
함수의 정수 인수는 최대 2개(x86) 또는 4개(x64) 정수 레지스터를 사용하고, 부동 소수점 및 벡터 값에 대해 최대 6개의 XMM 레지스터를 사용하여 값으로 전달되며 나머지는 오른쪽에서 왼쪽으로 스택에 전달됩니다. 호출된 함수는 반환하기 전에 스택을 정리합니다. 벡터 및 부동 소수점 반환 값은 XMM0으로 반환됩니다.
C의 경우 __vectorcall
명명 규칙은 함수 이름 뒤에 at 기호 2개(@@)와 함수 인수의 크기(바이트)를 사용합니다. 대/소문자 변환은 수행되지 않습니다. 컴파일러는 이 템플릿을 명명 규칙에 사용합니다.
functionname@@number
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.
구성 속성>C/C++>고급 속성 페이지를 선택합니다.
호출 규칙 속성을 수정합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- CallingConvention을(를) 참조하세요.