Post

What is the calling convention of the C++ lambda

주의 사항

이 글은 예전 블로그에서 옮겨온 오래 된 글입니다. 현재 상황과는 다를 수 있으며, 잘못 된 정보가 있을 수 있습니다.


지인이 물어 온 김에 정리 해 둡니다.

결론부터 말하면 C++ 의 Lambda 의 Calling Convention 은 상황에 맞춰 “그때그때 다르다” 입니다.

기본적으로 cdecl(물론 VC++ 프로젝트 설정에서 옵션을 바꾸면 다른 것도 가능합니다) 멤버여야 한다면 thiscall 그렇지 않으면 대입 되는 함수 포인터의 type 에 따라서 결정됩니다. 즉 원하는 형태로 대입만 하면 거기에 맞춰 적절히 컴파일 됩니다.

Image

외부에 callback 함수를 넘길 때 stdcall 로 선언해야 하는 경우가 꽤 되는데(특히 윈도우 API들) 이 때도 부담없이 Lambda 를 사용 할 수 있습니다.

단 아쉽게도 auto 와의 조합은 제공하지 않는데,

1
auto __stdcall f1 = [](int num1, int num2, int num3) { printf("%d %d %d\n", num1, num2, num3); };

와 같은 문법은 경고를 내며 __stdcall 이 무시됩니다…

This post is licensed under CC BY 4.0 by the author.