我正在为第三方应用程序编写一个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?
谢谢。
发布于 2011-08-03 00:13:29
__declspec()和__cdecl解决了调用函数的两个不同方面,您可以(在本例中,根据它的声音,您应该)使用这两个方面。
__cdecl指定了调用约定,指定了如何通过堆栈将参数传递给函数,并且非常重要的是,由谁在之后清理堆栈(对于__cdecl,是调用者负责清理)。
__declspec(dllimport/dllexport)用于简化从DLL中导出函数定义:您不需要使用它们,但是其他导出函数的方法却相当笨拙。
显式地使用__cdecl可能是一个好主意,而不是像您已经完成的代码片段那样,依赖于编译器来选择调用约定。我认为你可以用命令行开关来覆盖它,而且我相信根据你是在编译C代码还是C++代码,默认值是不同的,所以(通常)越显式越好。
发布于 2011-08-03 00:16:28
这些是正交的概念。__declspec只是表示有问题的实体的“存储类”。在您查看它的上下文中,它会告诉您是否指定了用于导入或导出的函数(在使用可以作为DLL的一部分构建或直接包含在可执行文件中的代码时,这通常是一个问题,具体取决于上下文)。
有关__declspec的更多信息,请访问here。
__cdecl调用约定表明函数使用传统的"C“语言约定来传递参数。还有其他风格,特别是__stdcall。
有关__cdecl与__stdcall (以及其他)的更多详细信息,请访问here。
https://stackoverflow.com/questions/6915047
复制相似问题