gpt4 book ai didi

c - 哪种调用约定用于通过 .def 文件导出的函数?

转载 作者:太空狗 更新时间:2023-10-29 16:13:00 30 4
gpt4 key购买 nike

我正在使用 Visual C++ 编译一些第三方 C 代码。源代码树包含以下 .def 文件:

LIBRARY "ThirdParty.dll"

EXPORTS
ThirdPartyFunction @1

ThirdPartyFunction() 定义附近没有明确的调用约定规范(如 __stdcall__cdecl)。 Visual C++ 项目属性(C++ -> 高级 -> 调用约定)设置为 __cdecl (/Gd)

哪个调用约定将用于导出的函数,我如何确保它是那个约定?

最佳答案

.def 文件不控制调用约定,它完全由编译器决定。如果你没有在函数声明中显式使用 __cdecl 或 __stdcall 那么它是编译器的默认值,所以 __cdecl。极端情况是 C++ 成员函数的 __thiscall 和托管代码的 __clrcall。

调用约定还选择名称修饰样式,专门为避免客户端代码出错而发明的。 __cdecl 在名称前添加一个下划线,__stdcall 附加“@n”,其中 n 是堆栈激活帧的大小。当客户端代码使用参数类型或数量不匹配的错误声明时,它可以防止堆栈不平衡,这是致命的且很难诊断 __stdcall 的问题。使用 .def 文件禁用此修饰实际上是一个坏主意,只有在使用 LoadLibrary+GetProcAddress 动态加载 DLL 时才应该考虑。如果您打算让非 C/C++ 客户端使用您的 DLL,那么显式使用 __stdcall 通常是个好主意,因为这往往是其他语言运行时的默认设置。

对于 64 位代码来说,这些都不重要,它很幸运地只有一个调用约定。虽然看起来微软是about to mess that up通过添加 __vectorcall 调用约定。

关于c - 哪种调用约定用于通过 .def 文件导出的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17722817/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com