/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 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 C++ 컴파일러 및 빌드 속성 설정을 참조하세요.

  2. 구성 속성>C/C++>고급 속성 페이지를 선택합니다.

  3. 호출 규칙 속성을 수정합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

참고 항목