현재 DLL로 배포 될 Windows 용 C ++ 라이브러리를 개발 중입니다. 내 목표는 바이너리 상호 운용성을 극대화하는 것입니다. 보다 정확하게는 DLL을 다시 컴파일 할 필요없이 여러 버전의 MSVC ++ 및 MinGW로 컴파일 된 코드에서 DLL의 함수를 사용할 수 있어야합니다. 그러나 어떤 호출 규칙이 가장 좋은지 cdecl
또는 stdcall
.
때때로 "C 호출 규칙은 컴파일러를 통틀어 동일한 것이 보장되는 유일한 것"과 같은 말을 듣습니다. 이는 " 의 해석 cdecl
, 특히 값을 반환하는 방법에 있어 약간의 변형이 있습니다. "와 대조됩니다 . 이것은 특정 라이브러리 개발자 (예 : libsndfile )가 배포하는 DLL에서 눈에 보이는 문제없이 C 호출 규칙을 사용하는 것을 막지는 않는 것 같습니다 .
반면에 stdcall
호출 규칙은 잘 정의 된 것 같습니다. 내가 말한 바에 따르면 모든 Windows 컴파일러는 기본적으로 Win32 및 COM에 사용되는 규칙이기 때문에이를 따라야합니다. 이것은 Win32 / COM을 지원하지 않는 Windows 컴파일러가 그다지 유용하지 않다는 가정을 기반으로합니다. 포럼에 게시 된 많은 코드 조각은 기능을 선언 stdcall
하지만 이유 를 명확하게 설명하는 단일 게시물을 찾을 수없는 것 같습니다 .
상충되는 정보가 너무 많고 검색 할 때마다 서로 다른 답변을 제공하므로 둘 사이를 결정하는 데 도움이되지 않습니다. 나는 왜 내가 다른 하나를 선택해야하는지 (또는 둘이 동등한 이유)에 대해 명확하고 자세하며 논증적인 설명을 찾고 있습니다.
이 질문은 "클래식"함수뿐만 아니라 가상 멤버 함수 호출에도 적용됩니다. 대부분의 클라이언트 코드는 "인터페이스", 순수 가상 클래스 (예를 들어 여기 와 거기에 설명 된 패턴을 따름)를 통해 내 DLL과 인터페이스하기 때문 입니다.