在C中以相反的顺序传递参数有什么意义?

时间:2013-09-09 01:18:26

标签: c function stack callstack calling-convention

在C中进行函数调用时,参数以相反的顺序传递。这很重要,这样我们就可以访问第一个参数。而这一些如何支持varargs。 我不明白即使你有权访问第一个参数,你仍然需要知道该函数有多少个参数,否则你可能很容易忽略最后一个参数并开始将无效值视为参数。

如果参数count是必需的,那么以相反的顺序传递参数是没有意义的,因为你可以用(sp - 2 * number_of_arguments,sp = stack pointer。)访问第一个参数。

以相反的顺序传递参数也应该有助于递归调用,我不明白如何。

提前谢谢。

2 个答案:

答案 0 :(得分:7)

C没有定义传递参数的顺序。事实上,一些非常常见的调用约定(如x86-64 SYSV ABI)会传递寄存器中的前几个参数,而根本没有任何顺序。

然而,对于变量参数列表函数来说,将参数从倒数第一个推到堆栈上是很常见的。这是因为为被调用函数发出的代码必须与传递的任意数量的附加参数一起使用。你是正确的,调用约定可以包括传递额外参数的数量 - 但以相反的顺序传递参数意味着这不是必需的,因此它是一个更简单的选项。你是正确的,在这种方案下很容易开始检查超过传递的最后一个参数的值 - 例如,如果你为给定的格式字符串传递的参数不足printf(),那么这就会发生。

具有固定数量参数的函数可以按任意顺序传递,实际上存在从左到右的调用约定(16位Windows API使用这样的调用约定)。

答案 1 :(得分:0)

理论上,没有偏好编译器如何生成代码以在堆栈或寄存器中存储参数。这实际上取决于目标机器的架构。

话虽如此,你在哪里知道他们处于相反的顺序。引用会很好地评估你的问题。

所以,真正的答案是,这取决于编译器作者希望做什么。

最后,注意这类似于反向波兰表示法:AB +表示A + B或前缀表示法,其中+ AB表示A + B.因此,只要编译器是一致的,那么排序就不重要了。