C언어 Calling Convention

Language 2017. 11. 26. 20:37

대표적으로 __cdecl과 __stdcall이 있는데, 이 둘의 차이점은

memory에서 argument stack을 생성/정리하는 것이 caller냐 callee냐이다


__cdecl -> caller가 parameter stack 정리 -> default calling convention

__stdcall -> callee가 parameter stack 정리 -> WINAPI calling convention

__stdcall 호출 규칙은 Win32 API 함수를 호출하는 데 사용됩니다. 호출 수신자가 스택을 정리하므로 컴파일러는 vararg 함수를 __cdecl로 만듭니다. 이 호출 규칙을 사용하는 함수에는 함수 프로토타입이 필요합니다.
참조: https://msdn.microsoft.com/ko-kr/library/zxk0tw93.aspx

덧붙이자면

variable argument function(가변인자 함수)의 경우 caller가 직접 stack을 정리하는 __cdecl을 사용하는 것이 적절하다

argument의 갯수를 caller만이 알고있기 때문이다

프로그래머가 __stdcall로 선언해도 __cdecl로 컴파일한다


함수에 호출 규약을 별도로 명시하지않으면 암묵적으로 cdecl을 사용한다 (기본 호출 규악인 것처럼)

그런데 WINAPI는 왜 굳이 stdcall을 사용할까?


stdcall을 직역하면 "표준 호출"로, 다른 언어에서 WINAPI를 호출할 경우 호환성(compatibility)을 위한 것이다

참조: cfile30.uf.tistory.com/attach/27486F4B5674253F22A740


python ctypes 라이브러리을 사용하려고 documentation을 살펴보다가, cdll과 windll의 calling convention이 언급되어있어서 찾아보게 되었다



WRITTEN BY
hojongs
블로그 옮겼습니다 https://hojongs.github.io/