대표적으로 __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이 언급되어있어서 찾아보게 되었다
'Language' 카테고리의 다른 글
non block IO의 advantage는 무엇인가? [번역] (0) | 2017.12.04 |
---|---|
TDD, python unittest 사용이유 (junit) (0) | 2017.12.01 |
binary data 처리 이슈 (vs string data) (0) | 2017.11.26 |
Windows API - CreateProcess() Function (1) | 2015.12.02 |
Shell Script 실행방법의 종류들과 그 차이 (0) | 2015.12.01 |
WRITTEN BY
- hojongs
블로그 옮겼습니다 https://hojongs.github.io/