인수 전달 및 명명 규칙
Microsoft 전용
Microsoft C++ 컴파일러를 사용하면 함수와 호출자 간에 인수를 전달하고 값을 반환하기 위한 규칙을 지정할 수 있습니다. 지원되는 모든 플랫폼에서 모든 규칙을 사용할 수 있는 것은 아니며, 일부 규칙은 플랫폼별 구현을 사용합니다. 대부분의 경우 특정 플랫폼에서 지원되지 않는 규칙을 지정하는 키워드 또는 컴파일러 스위치는 무시되며 플랫폼 기본 규칙이 사용됩니다.
x86 플랫폼에서는 모든 인수가 전달되면 32비트로 확장됩니다. 반환 값도 32비트로 확장되며 EDX:EAX 레지스터 쌍에서 반환되는 8바이트 구조체를 제외하고 EAX 레지스터에서 반환됩니다. 더 큰 구조체는 숨겨진 반환 구조체에 대한 포인터로 EAX 레지스터에서 반환됩니다. 매개 변수는 오른쪽에서 왼쪽으로 스택에 푸시됩니다. POD가 아닌 구조체는 레지스터에서 반환되지 않습니다.
컴파일러는 ESI, EDI, EBX 및 EBP 레지스터가 함수에서 사용되는 경우 이러한 레지스터를 저장하고 복원하는 프롤로그 및 에필로그 코드를 생성합니다.
참고 항목
구조체, 공용 구조체 또는 클래스가 값으로 함수에서 반환되는 경우 형식의 모든 정의가 동일해야 하며, 그렇지 않으면 프로그램이 런타임에 실패할 수 있습니다.
고유한 함수 프롤로그 및 에필로그 코드를 정의하는 방법에 대한 자세한 내용은 Naked 함수 호출을 참조하세요.
x64 플랫폼을 대상으로 하는 코드의 기본 호출 규칙에 대한 자세한 내용은 x64 호출 규칙을 참조하세요. ARM 플랫폼을 대상으로 하는 코드에서 규칙 문제를 호출하는 방법에 대한 자세한 내용은 일반적인 Visual C++ ARM 마이그레이션 문제를 참조하세요.
다음과 같은 호출 규칙이 Visual C/C++ 컴파일러에서 지원됩니다.
키워드 | 스택 정리 | 매개 변수 전달 |
---|---|---|
__cdecl | 호출자 | 매개 변수를 스택에 역순으로(오른쪽에서 왼쪽으로) 푸시합니다. |
__clrcall | 해당 없음 | CLR 식 스택에 매개 변수를 순서대로(왼쪽에서 오른쪽으로) 로드합니다. |
__stdcall | 호출 수신자 | 매개 변수를 스택에 역순으로(오른쪽에서 왼쪽으로) 푸시합니다. |
__fastcall | 호출 수신자 | 레지스터에 저장된 다음 스택에 푸시됩니다. |
__thiscall | 호출 수신자 | 스택에 푸시됨; this ECX에 저장된 포인터 |
__vectorcall | 호출 수신자 | 레지스터에 저장된 다음 스택에 역순으로(오른쪽에서 왼쪽으로) 푸시됩니다. |
관련 정보는 사용되지 않는 호출 규칙을 참조 하세요.
Microsoft 전용 종료
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기