在C 语言中,调用约定有什么作用?

编程语言 2026-07-08

在C 或其他编程语言中,调用约定的意义何在?它们似乎只控制将哪个参数先压入栈,以及由谁来清理栈。

示例:

__stdcall:参数按从右到左的顺序压入,被调用方(函数)清理栈。

__cdecl:参数按从右到左的顺序压入,调用方清理栈。

那么这将如何影响我们的程序?

解决方案

当一个子程序调用另一个子程序时,两个子程序需要互相通信。它们中的每一个都必须向对方传递信息(主要是将调用方的参数传递给被调用方,以及把被调用方的返回值传回给调用方,但也可能包含额外信息),并在一般意义上协调计算机的状态。

调用约定不仅仅控制参数在栈上压入的顺序或谁来清理栈。它们也可能控制哪些参数在寄存器中传递而不是在栈上传递,以及传递到哪些寄存器。(这取决于参数的大小和类型、数量以及其他因素。)它们可能控制传递参数的格式。它们可能控制在调用一个子程序时或返回时,如何设置某些处理器标志。它们可能控制从被调用子程序返回到调用方的值的方式。它们可能控制关于如何处理发生的异常的信息的传递方式。

如果两个子程序在调用子程序时不使用相同的规则,程序可能无法正常工作——被调用的子程序可能使用错误的数据,或以会导致程序中止的方式改变计算机状态,甚至可能产生其他不良后果。

有时在调用子程序时可选择一组规则。这可能是因为一组规则是为较旧的程序编写的,而技术和软件的变化使得在可能的情况下使用新的一组规则更有利——但程序仍然可能需要调用一些按照旧规则编写的子程序。或者,不同的规则集可能有不同的优点,适用于不同的情景,例如在小型程序中调用简单子程序时需要更省空间或时间,而当程序使用大量数据和代码、并拥有更大的地址空间时则需要更多的空间或时间。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章