__ cdecl 또는 __stdcall on Windows?

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

때로는 "C 호출 규칙이 " cdecl , 특히 값을 반환하는 방법 "의 해석에 약간의 차이가 있습니다. 이것은 특정 라이브러리 개발자 ( libsndfile 와 같은)가 배포하는 DLL에서 눈에 보이는 문제없이 C 호출 규칙을 사용하는 것을 막지 않는 것 같습니다.

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

너무 많은 상충되는 정보가 있습니다. , 내가 실행하는 모든 검색은 나에게 서로 다른 답변을 제공하므로 둘 중 하나를 결정하는 데 실제로 도움이되지 않습니다. 나는 왜 내가 다른 것보다 하나를 선택해야하는지에 대해 명확하고 자세하며 논쟁적인 설명을 찾고 있습니다.또는 두 가지가 동일한 이유).

이 질문은 "클래식"함수뿐만 아니라 가상 멤버 함수 호출에도 적용됩니다. 대부분의 클라이언트 코드는 "인터페이스", 순수 가상 클래스 ( 예를 들어 여기 )에 설명 된 패턴을 따릅니다.

76
задан Community 23 May 2017 в 12:32
поделиться