__cdecl

__cdecl 는 C 및 C++ 프로그램에 대한 기본 호출 규칙입니다. 스택이 호출자에 의해 클린 있으므로 함수를 수행할 vararg 수 있습니다. 호출 규칙은 __cdecl 스택 클린up 코드를 포함하기 위해 각 함수 호출이 필요하기 때문에 __stdcall 것보다 더 큰 실행 파일을 만듭니다. 다음 목록에서는 이러한 호출 규칙의 구현을 보여 줍니다. 한 __cdecl 정자는 Microsoft 전용입니다.

요소 구현
인수 전달 순서 오른쪽에서 왼쪽
스택 유지 관리 책임 호출하는 함수가 스택에서 인수를 꺼냅니다.
이름 데코레이션 규칙 C 링크를 사용하는 __cdecl 함수를 내보낼 경우를 제외하고 밑줄 문자(_)는 이름 앞에 접두사로 지정됩니다.
대/소문자 변환 규칙 대/소문자 변환은 수행되지 않습니다.

참고 항목

관련 정보는 데코레이팅된 이름을 참조 하세요.

__cdecl 변수 또는 함수 이름 앞에 한정자를 배치합니다. C 명명 및 호출 규칙이 기본값이므로 x86 코드에서 사용해야 __cdecl 하는 유일한 시간은 (vectorcall), (stdcall) /Gz 또는 /Gr (fastcall) 컴파일러 옵션을 지정한 /Gv 경우입니다. /Gd 컴파일러 옵션은 호출 규칙을 강제로 실행합니다__cdecl.

ARM 및 x64 프로세서 __cdecl 에서는 허용되지만 일반적으로 컴파일러에서 무시됩니다. ARM 및 x64에서는 규칙에 따라 인수는 가능한 경우 레지스터로 전달되고 이후 인수는 스택에 전달됩니다. x64 코드 __cdecl 에서 /Gv 컴파일러 옵션을 재정의하고 기본 x64 호출 규칙을 사용합니다.

비정적 클래스 함수의 경우 함수가 아웃오브 라인으로 정의되면 호출 규칙 한정자를 아웃오브 라인 정의에서 지정하지 않아도 됩니다. 즉, 클래스 비정적 멤버 메서드의 경우 선언하는 동안 지정된 호출 규칙이 정의 시 가정됩니다. 다음의 클래스 정의를 가정해 봅니다.

struct CMyClass {
   void __cdecl mymethod();
};

다음 코드는

void CMyClass::mymethod() { return; }

다음 코드 조각과 일치합니다.

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

이전 버전과의 호환성을 위해 컴파일러 옵션 /Za(언어 확장 사용 안 함)를 지정하지 않는 한 cdecl_cdecl 동의어 __cdecl 입니다.

예시

다음 예제에서 컴파일러는 system 함수에 대해 C 명명 규칙 및 호출 규칙을 사용하도록 지시되었습니다.

// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

참고 항목

인수 전달 및 명명 규칙
키워드