8

当在 C 中进行函数调用时,参数以相反的顺序传递。这很重要,因此我们可以访问第一个参数。这有点支持可变参数。我不明白即使您可以访问第一个参数,您仍然需要知道该函数有多少个参数,否则您可能很容易跳过最后一个参数并开始将无效值视为参数。

如果需要参数计数,那么以相反的顺序传递参数是没有意义的,因为您可以使用 (sp - 2 * number_of_arguments, sp = stack pointer.

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

先感谢您。

4

2 回答 2

11

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

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

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

于 2013-09-09T01:39:37.227 回答
0

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

话虽如此,您从哪里得到他们必须以相反顺序排列的想法。引用将很好地评估您的问题。

所以,真正的答案是,它取决于编译器作者想要做什么。

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

于 2013-09-09T01:49:22.390 回答