[c++] Windows에서 __cdecl 또는 __stdcall?


Answers

두 가지 호출 규칙에서 가장 큰 차이점은 " _ _cdecl"은 호출자의 함수 호출 후에 스택의 균형을 조정해야하므로 가변 인수 인수가있는 함수를 허용한다는 점입니다. "__stdcall"규칙은 본질적으로 "더 간단"하지만 이와 관련하여 유연성이 떨어집니다.

또한, 관리되는 언어는 기본적으로 stdcall 규칙을 사용한다고 생각합니다. 따라서 P / Invoke를 사용하는 사용자는 cdecl을 사용하면 명시 적으로 호출 규칙을 명시해야합니다.

그래서 모든 함수 시그니처가 정적으로 정의 될 경우 나는 cdecl이 아니라면 stdcall쪽으로 기울어 질 것입니다.

Question

현재 Windows 용 C ++ 라이브러리를 개발 중이며이 라이브러리는 DLL로 배포됩니다. 내 목표는 이진 상호 운용성을 극대화하는 것입니다. 더 정확히 말하면 DLL의 함수는 여러 버전의 MSVC ++ 및 MinGW로 컴파일 된 코드에서 DLL을 다시 컴파일하지 않고도 사용할 수 있어야합니다. 그러나 어떤 호출 규칙이 가장 좋은지 cdecl 또는 stdcall 대해 혼란 스럽습니다.

때로는 "C 호출 규칙이 동일한 컴파일러가되도록 보장 된 유일한 선언문"과 같은 문구를 듣는 경우가 있습니다. " cdecl 의 해석에 여러 가지 변형이 있으며, 특히 값을 반환하는 방법이 있습니다 "와 같은 문구와는 대조적입니다. 이것은 libsndfile 과 같은 특정 라이브러리 개발자가 눈에 보이는 문제없이 배포하는 DLL에서 C 호출 규칙을 사용하는 것을 중지시키지 않는 것처럼 보입니다.

반면 stdcall 호출 규칙은 잘 정의 된 것 같습니다. 내가 말했던 것부터, 모든 Windows 컴파일러는 기본적으로 Win32 및 COM에 사용되는 규칙이기 때문에이를 따라야합니다. 이것은 Win32 / COM 지원이없는 Windows 컴파일러가별로 유용하지 않다는 가정에 기반합니다. 포럼에 게시 된 많은 코드 스 니펫은 stdcall 함수를 선언하지만 분명히 이유를 설명하는 하나의 단일 게시물을 찾지 못하는 것 같습니다.

너무 많은 상충되는 정보가 있습니다. 그리고 내가하는 모든 검색은 나에게 두 가지를 결정하는 데 정말로 도움이되지 않는 다른 답변을 제공합니다. 나는 왜 다른 하나 이상을 선택해야하는지 (또는 왜 둘이 같은지)에 관해 명확하고 상세한 설명을 구하고있다.

이 질문은 "클래식"함수뿐만 아니라 가상 멤버 함수 호출에도 적용됩니다. 대부분의 클라이언트 코드는 "인터페이스", 순수 가상 클래스 (예 : here 설명 된 패턴)를 통해 내 DLL과 연결되기 there 입니다.




Related