__cdecl和__declspec调用约定混淆

__cdecl and __declspec calling conventions confusion

本文关键字:约定 declspec cdecl 调用      更新时间:2023-10-16

我正在为第三方应用程序编写DLL。主软件工程师提到应用程序使用__cdecl (/Gd)调用约定。我需要确保我使用了这个

此外,第三方已经提供给我一个c++ DLL框架,导出函数如下:

#ifdef _EXPORTING
  #define DECLSPEC    __declspec(dllexport)
#else
   #define DECLSPEC    __declspec(dllimport)
#endif
#ifdef __cplusplus
   extern "C" {  
#endif
DECLSPEC int ICD_Create(char* id);
....
....

我有点困惑。为什么函数被导出使用__declspec约定而不是__cdedl??__declspec是否支持_cdecl?

谢谢。

__declspec()__cdecl处理调用函数的两个不同方面,您可以(在这种情况下,听起来应该)同时使用。

__cdecl指定了调用约定,它指定了参数如何通过堆栈传递给函数,并且,非常重要的是,谁在之后清理堆栈(在__cdecl的情况下是调用者清理)。

__declspec(dllimport/dllexport)用于简化从DLL导出函数定义:您不需要使用它们,但是导出函数的其他方法相当笨拙。

显式地使用__cdecl可能是一个好主意,而不是做你所做的代码片段,这是依赖于编译器选择调用约定。我认为你可以用命令行开关覆盖这个,我相信默认值是不同的,这取决于你是编译C还是c++代码,所以更显式(像往常一样)更好。

这些是正交的概念。__declspec仅表示所讨论的实体的"存储类"。在您正在查看的上下文中,它会告诉您是否指定用于导入或导出的函数(这通常是在处理可以作为DLL的一部分构建或直接包含在可执行文件中的代码时遇到的问题,具体取决于上下文)。

__declspec的更多信息在这里。

__cdecl调用约定表明该函数使用传统的"C"语言约定来传递参数。还有其他样式,特别是__stdcall

__cdecl__stdcall(和其他)的更多细节在这里。