Tôi hiện đang phát triển thư viện C ++ cho Windows sẽ được phân phối dưới dạng DLL. Mục tiêu của tôi là tối đa hóa khả năng tương tác nhị phân; chính xác hơn, các chức năng trong DLL của tôi phải có thể sử dụng được từ mã được biên dịch với nhiều phiên bản MSVC ++ và MinGW mà không cần phải biên dịch lại DLL. Tuy nhiên, tôi bối rối không biết quy ước gọi nào là tốt nhất, cdecl
hoặc stdcall
.
Đôi khi tôi nghe thấy các tuyên bố như "quy ước gọi C là quy ước duy nhất được đảm bảo là giống nhau giữa các trình biên dịch", điều này trái ngược với các tuyên bố như " Có một số biến thể trong cách diễn giải cdecl
, đặc biệt là trong cách trả về giá trị ". Điều này dường như không ngăn các nhà phát triển thư viện nhất định (như libsndfile ) sử dụng quy ước gọi C trong các tệp DLL mà họ phân phối mà không gặp bất kỳ vấn đề nào.
Mặt khác, stdcall
quy ước gọi dường như đã được xác định rõ ràng. Từ những gì tôi đã được nói, tất cả các trình biên dịch Windows về cơ bản bắt buộc phải tuân theo nó vì đó là quy ước được sử dụng cho Win32 và COM. Điều này dựa trên giả định rằng trình biên dịch Windows không hỗ trợ Win32 / COM sẽ không hữu ích lắm. Rất nhiều đoạn mã được đăng trên các diễn đàn khai báo các chức năng stdcall
nhưng tôi dường như không thể tìm thấy một bài đăng nào giải thích rõ ràng tại sao .
Có quá nhiều thông tin mâu thuẫn ngoài đó và mỗi tìm kiếm tôi chạy đều cho tôi những câu trả lời khác nhau, điều này không thực sự giúp tôi quyết định giữa hai điều đó. Tôi đang tìm kiếm một lời giải thích rõ ràng, chi tiết, được tranh luận về lý do tại sao tôi nên chọn cái này hơn cái kia (hoặc tại sao cả hai tương đương nhau).
Lưu ý rằng câu hỏi này không chỉ áp dụng cho các hàm "cổ điển", mà còn cho các lệnh gọi hàm thành viên ảo, vì hầu hết mã máy khách sẽ giao tiếp với DLL của tôi thông qua "giao diện", các lớp ảo thuần túy (theo các mẫu được mô tả, ví dụ như ở đây và ở đó ).