__stdcall 호출 규칙은 Win32 API 함수를 호출 하는 데 사용 됩니다.The __stdcall calling convention is used to call Win32 API functions. 호출 수신자가 스택을 정리 하므로 컴파일러는 함수를 vararg 만듭니다 __cdecl .The callee cleans the stack, so the compiler makes vararg functions __cdecl. 이 호출 규칙을 사용하는 함수에는 함수 프로토타입이 필요합니다.Functions that use this calling convention require a function prototype. __stdcall 한정자는 Microsoft 전용입니다.The __stdcall modifier is Microsoft-specific.


반환 형식 __stdcall 함수 이름[ ( 인수 목록 ) ]return-type __stdcall function-name[( argument-list )]


다음 목록에서는 이러한 호출 규칙의 구현을 보여 줍니다.The following list shows the implementation of this calling convention.

요소Element 구현Implementation
인수 전달 순서Argument-passing order 오른쪽에서 왼쪽Right to left.
인수 전달 규칙Argument-passing convention 포인터 또는 참조 형식이 전달되지 않는 경우 값으로 전달By value, unless a pointer or reference type is passed.
스택 유지 관리 책임Stack-maintenance responsibility 호출된 함수가 스택에서 자신의 인수를 꺼냅니다.Called function pops its own arguments from the stack.
이름 데코레이션 규칙Name-decoration convention 밑줄 ( _ )은 이름 앞에 붙습니다.An underscore (_) is prefixed to the name. 이름 뒤에는 @ 인수 목록의 바이트 수 (10 진수)가 나옵니다.The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. 따라서 int func( int a, double b )로 선언된 함수는 _func@12로 데코레이팅됩니다.Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12
대/소문자 변환 규칙Case-translation convention 없음None

/Gz 컴파일러 옵션은 __stdcall 다른 호출 규칙을 사용 하 여 명시적으로 선언 되지 않은 모든 함수에 대해를 지정 합니다.The /Gz compiler option specifies __stdcall for all functions not explicitly declared with a different calling convention.

이전 버전과의 호환성을 위해 _stdcall__stdcall 컴파일러 옵션 /Za ( 언어 확장 사용 안 함 을 지정 하지 않는 경우의 동의어입니다.For compatibility with previous versions, _stdcall is a synonym for __stdcall unless compiler option /Za (Disable language extensions) is specified.

한정자를 사용 하 여 선언 된 함수 __stdcall 는를 사용 하 여 선언 된 함수와 동일한 방식으로 값을 반환 __cdecl 합니다.Functions declared using the __stdcall modifier return values the same way as functions declared using __cdecl.

ARM 및 x64 프로세서에서 __stdcall 는 컴파일러에서 허용 되 고 무시 됩니다. arm 및 x64 아키텍처에서 규칙에 따라 인수는 가능한 경우 레지스터에 전달 되 고 이후 인수는 스택에 전달 됩니다.On ARM and x64 processors, __stdcall is accepted and ignored by the compiler; on ARM and x64 architectures, by convention, arguments are passed in registers when possible, and subsequent arguments are passed on the stack.

비정적 클래스 함수의 경우 함수가 아웃오브 라인으로 정의되면 호출 규칙 한정자를 아웃오브 라인 정의에서 지정하지 않아도 됩니다.For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. 즉, 클래스 비정적 멤버 메서드의 경우 선언하는 동안 지정된 호출 규칙이 정의 시 가정됩니다.That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. 다음과 같은 클래스 정의가 주어진 경우Given this class definition,

struct CMyClass {
   void __stdcall mymethod();


void CMyClass::mymethod() { return; }

다음 코드와 동일합니다.is equivalent to this

void __stdcall CMyClass::mymethod() { return; }


다음 예제에서를 사용 하면 __stdcall 모든 WINAPI 함수 형식이 표준 호출로 처리 됩니다.In the following example, use of __stdcall results in all WINAPI function types being handled as a standard call:

// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

참고 항목See also

인수 전달 및 명명 규칙Argument Passing and Naming Conventions