__cdecl和__declspec调用约定混淆
__cdecl and __declspec calling conventions confusion
我正在为第三方应用程序编写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
(和其他)的更多细节在这里。
相关文章:
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 为什么在 x64 中忽略__stdcall调用约定?
- 引发异常的方法的命名约定 (C++)?
- 窗口调用约定
- 我应该提到纯虚函数中的调用约定吗?
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 如何使用gcc指定stdcall调用约定
- Clang:x86 FPU调用约定
- 该标准是否说明了例外和不同调用约定的共存
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- std::sort & comp - 调用约定?
- C ++:DECLSPEC,静态库和DLL
- C++命名空间约定
- C++的新手试图弄清楚类约定
- 如何为类 /块 /范围选择C 调用约定
- C 未知呼叫约定
- C++关于传递对象(指针与引用)的约定
- DLL 的"good"调用约定是什么?
- 结构中重载运算符的调用约定
- 一些编码约定/标准实践问题