8

我正在为第三方应用程序编写 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?

谢谢。

4

2 回答 2

15

__declspec()并且__cdecl正在解决调用该函数的两个不同方面,您可以(在这种情况下,您应该通过它的声音)同时使用这两个方面。

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

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

__cdecl显式使用而不是执行您已经完成的代码片段可能是一个好主意,这依赖于编译器来选择调用约定。您可以使用我认为的命令行开关来覆盖它,并且我相信默认值会有所不同,具体取决于您是编译 C 还是 C++ 代码,所以更明确(像往常一样)更好。

于 2011-08-02T16:13:29.267 回答
9

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

更多信息__declspec这里。

__cdecl调用约定表明该函数使用传统的“C”语言约定来传递参数。还有其他风格,尤其是__stdcall.

__cdecl关于vs __stdcall(和其他)的更多细节在这里

于 2011-08-02T16:16:27.700 回答