繁体   English   中英

__cdecl的使用,其职责是清理堆栈

[英]use of __cdecl and whose responsibility is to clean the stack

在了解__cdecl之后,我对堆栈清洁感到困惑。

请阅读__cdecl将弹出堆栈参数( https://msdn.microsoft.com/zh-cn/library/zkwh89ks.aspx

那么我们是否需要在函数声明中明确提及删除堆栈参数,还是由编译器负责生成适当的代码以清理堆栈?

提前感谢

只要其他人( #include要使用您的库的#include头)正确声明该函数,编译器便会完成工作。 如果您未能为标头提供适当的声明,则他们需要使用适当的调用约定自行声明该函数,否则它将使用碰巧适用于其项目的任何默认参数传递约定。

除非您正在编写程序集,否则无需编写任何内容即可清理堆栈。 编译器将生成所需的代码。

读取__cdecl将弹出堆栈参数

您误读了链接到的文档。 它的实际含义是:

调用函数从堆栈中弹出参数。

在cdecl中,只有调用者知道哪些参数已被压入堆栈(这是支持可变参数的唯一方法),因此只有调用者知道如何正确清理堆栈。 只要您不编写汇编代码,并且将函数显式声明为__cdecl或项目的默认调用约定是__cdecl ,您就不必担心这一点。 编译器将生成正确的代码。 就个人而言,如果您需要在多个项目中或与其他人共享此功能,我建议不要依赖默认项目设置。 最好明确声明调用约定是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM