我目前正在为Windows开发一个C ++库,该库将作为DLL分发。我的目标是最大程度地实现二进制互操作性。更确切地说,我的DLL中的功能必须可以从使用多个版本的MSVC ++和MinGW编译的代码中使用,而不必重新编译DLL。但是,我对哪种调用约定最好cdecl
还是感到困惑stdcall
。
有时我听到诸如“ C调用约定是唯一保证在整个编译器中都相同的声明”之类的语句,这与诸如“的解释存在某些变化cdecl
,尤其是如何返回值”之类的语句形成对比。这似乎并未阻止某些库开发人员(如libsndfile)在其分发的DLL中使用C调用约定,而没有任何可见的问题。
另一方面,stdcall
调用约定似乎定义明确。据我了解,基本上所有Windows编译器都必须遵循它,因为它是Win32和COM的约定。这是基于这样的假设:没有Win32 / COM支持的Windows编译器将不是很有用。论坛上发布的许多代码片段都声明了函数的功能,stdcall
但我似乎找不到一个明确解释原因的帖子。
那里有太多相互矛盾的信息,我进行的每次搜索都会给我不同的答案,但这并不能真正帮助我在两者之间做出决定。我正在寻找一个清晰,详细,有争议的解释,以说明为什么我应该选择一个而不是另一个(或者为什么两者相等)。
请注意,这个问题不仅适用于“经典”的功能,而且还虚成员函数调用,因为大多数客户端代码将与我的DLL通过“接口”,纯虚类接口(以下模式,例如描述在这里和那里)。