首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__cdecl和__declspec调用约定混淆

__cdecl和__declspec调用约定混淆
EN

Stack Overflow用户
提问于 2011-08-03 00:06:22
回答 2查看 12.1K关注 0票数 8

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

此外,第三方还向我提供了一个C++ DLL框架,它可以导出如下函数:

代码语言:javascript
复制
#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?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-03 00:13:29

__declspec()__cdecl解决了调用函数的两个不同方面,您可以(在本例中,根据它的声音,您应该)使用这两个方面。

__cdecl指定了调用约定,指定了如何通过堆栈将参数传递给函数,并且非常重要的是,由谁在之后清理堆栈(对于__cdecl,是调用者负责清理)。

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

显式地使用__cdecl可能是一个好主意,而不是像您已经完成的代码片段那样,依赖于编译器来选择调用约定。我认为你可以用命令行开关来覆盖它,而且我相信根据你是在编译C代码还是C++代码,默认值是不同的,所以(通常)越显式越好。

票数 15
EN

Stack Overflow用户

发布于 2011-08-03 00:16:28

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

有关__declspec的更多信息,请访问here

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

有关__cdecl__stdcall (以及其他)的更多详细信息,请访问here

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6915047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档