2009-02-09 2 views
8

다음과 같이 선언 :C에서 "CALLBACK"선언은 무엇을합니까? 나는 <a href="http://www.libsdl.org" rel="noreferrer">SDL</a> 라이브러리에서 일부 코드를보고하는 기능 건너 온 한

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 

지금, 내가 델파이 코더입니다. 아니야, 아가씨. 하지만 대학 강의에서 다음과 같이 읽을 수있는 구문을 충분히 기억합니다.

함수 이름은 WndProc입니다. 인수 목록은 꽤 자명하다. 함수 반환 유형은 LRESULT입니다. 그러나 세계에서 "콜백 (CALLBACK)"은 거기에서 무엇을하고 있는가? Delphi에서는 어떤 함수 든 콜백으로 사용할 수 있습니다. 함수 포인터의 올바른 유형을 전달하면됩니다. C가 그런 식으로 작동하지 않는 특별한 이유가 있습니까? 아니면 뭔가 다른 것을 의미합니까?

답변

2

그것은 호출 규칙입니다. 나중에이 함수를 호출하는 Windows API에이 함수에 대한 포인터를 전달할 때 필요합니다. Windows 호출 규칙은 C 호출 규칙과 다르므로 WndProc()이 특수하고 다른 시작 및 정리 코드가 필요하다는 것을 컴파일러에 지정해야합니다.

0

델파이는 호출 규칙이며 델파이도 가지고 있습니다. 델파이 도움말에서 'cdecl'을 찾아보십시오. 델파이 (또는 우리가 그것을 좋아할 객체 파스칼)에서 호출 규칙은 다음과 같은 함수 선언 뒤에옵니다.

function MyFunction(X, Y: Real): Real; cdecl; 
레이몬드 첸의 블로그에서
4

짧은 검거 : x86 플랫폼에서 호출 규칙에 대한

의 좋은 점은 선택할 많은 있다는 것을 입니다! 그 수의 매개 변수와 함수의 사용을 허용하기 때문에

C 호출 규칙 (__cdecl)는

C 호출 규칙은 제한된다. 스택이 호출자가 정리되고 매개 변수가 오른쪽에서 왼쪽으로 푸시되어야하므로 첫 번째 매개 변수는 스택의 맨 위에 상대적으로 고정 된 위치에 있어야합니다. 요약하면 : 호출자는 스택을 정리하고 오른쪽에서 왼쪽으로 밀어 넣은 매개 변수를 정리합니다. 는 수신자 청소 규칙을 사용할 수 있도록

파스칼 호출 규칙은 (__pascal)

파스칼, 매개 변수의 변수 번호 기능을 지원하지 않습니다. 매개 변수가 왼쪽에서 오른쪽으로 푸시됩니다. 거의 모든 Win16 함수는 파스칼 호출 규칙으로 내보내집니다. callee-clean 규칙은 함수 당 2 바이트의 고정 오버 헤드로 각 호출 지점에 3 바이트를 저장합니다. 그것은 또한 부분적으로 더 빨랐다. Win16에서는 몇백 바이트와 몇 사이클을 절약하는 것이 큰 문제였습니다. 주 : Fortran 호출 규칙 (__fortran)은 파스칼 호출 규칙과 동일합니다.