2010-08-04 8 views
6

다른 호출 규칙을 사용하는 데있어서 핵심 요소는 무엇입니까? 어떤 경우 다른 사람에게 __cdecl 또는 __stdcall 또는 __fastcall과 같은 특정 호출 규칙을 사용하는 경우가 있습니다.호출 규칙을 사용하는 경우

예제가 실제로 적용될 수 있습니다.

답변

12

대부분의 경우 걱정할 필요가 없습니다. 일반적으로 __cdecl을 사용하지만 이는 Visual C++의 기본값이기 때문입니다. 그러나 Visual C++에서 C++ 멤버 함수는 기본적으로 __thiscall 규칙을 사용합니다.

Windows API와 같은 API 함수에 콜백을 전달할 때 호출 규칙에 대해 실제로 염려해야하는 상황이 있습니다. 여기

// CALLBACK is #define'd as __stdcall 
LRESULT CALLBACK MyWndProc(HWND hwnd, UINT msg 
    WPARAM wParam, LPARAM lParam); 
// ... 
windowClass.lpfnWndProc = &MyWndProc; 
::RegisterClass(&windowClass); 

, 우리는 __stdcall 규칙 (CALLBACK#define는 '__stdcall로서 D)를 갖는 것으로 선언 MyWndProc(). 운영 체제에서 lpfnWndProcWNDPROC, which uses the CALLBACK convention을 가리킬 것으로 예상되므로이 작업이 필요합니다. 콜백을 받아

거의 모든 Windows API 함수는 __stdcall 규칙을 사용하는 콜백 함수를 필요로하고, __cdecl 기본이 일반적이기 때문에, 당신은 (당신이 창 절차 CALLBACK을 사용)이 명시해야합니다.

운영 체제가 비 __stdcall 함수를 호출하려고 시도하면 스택 손상이 발생할 수 있으므로 이는 매우 중요합니다. 불행히도 충분한 사람들은 이것을 잘못 이해합니다. Windows will actually check for calling convention mismatch specifically for window procedures.

WinAPI 함수에 전달되는 콜백 함수에는 필수 요소 인 반면 가변 호출 수를 허용하는 함수는 __cdecl 호출 규칙을 사용해야합니다. 호출자 만 가변 인수를 스택에서 올바르게 팝하는 방법을 알고 있기 때문입니다. 일반적으로 __cdecl이 기본값이기 때문에 다양한 인수를 허용하는 함수에 대해 __cdecl을 명시 적으로 지정할 필요가 없습니다.

개인적으로는 누군가가 가지고 있다고하더라도 __fastcall에 대한 사용을 발견하지 못했습니다.

__clrcall은 관리 코드와 상호 작용하는 경우에만 해당됩니다.

관련 문제