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

在C中以相反的顺序传递参数有什么意义?,c,function,stack,callstack,calling-convention,C,Function,Stack,Callstack,Calling Convention,在C中进行函数调用时,参数按相反顺序传递。这一点很重要,这样我们就可以获得第一个论点。这是如何支持varargs的。 我不明白,即使您可以访问第一个参数,您仍然需要知道函数有多少个参数,否则您可能很容易跳过最后一个参数,并开始将无效值视为参数 如果参数计数是必需的,那么以相反的顺序传递参数是没有意义的,因为您可以使用(sp-2*number\u of_arguments,sp=stack pointer)访问第一个参数 以相反的顺序传递参数也应该有助于递归调用,我不明白怎么做 提前谢谢。C没有定

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

如果参数计数是必需的,那么以相反的顺序传递参数是没有意义的,因为您可以使用(sp-2*number\u of_arguments,sp=stack pointer)访问第一个参数

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


提前谢谢。

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


但是,变量参数列表函数从最后一个到第一个将其参数推送到堆栈上是非常常见的。这是因为为被调用函数发出的代码必须处理任何数量的传递的附加参数。您是对的,调用约定可能包括传递addi的数量可选参数-但以相反的顺序传递参数意味着这不是必需的,因此这是一个更简单的选项。您可以正确地看到,在这个方案下,很容易在传递的最后一个参数之后开始检查值-这就是可能发生的情况,例如,如果您向
printf()传递的参数不足
用于给定格式字符串


具有固定数量参数的函数可以按任意顺序传递,事实上,从左到右的调用约定确实存在(16位Windows API使用这种调用约定)从理论上讲,编译器如何生成代码来将参数存储在堆栈或寄存器中并不受欢迎。这实际上取决于目标机器的体系结构

话虽如此,你从哪里知道他们的顺序是相反的。引用一篇文章来评价你的问题会很好

因此,真正的答案是,这取决于编译器编写者希望做什么


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

您能提供一个参考吗?另外,vararg处理需要1个非vararg参数,我想如果它们来自结束beginingreference的含义?我说的是C中的函数调用。你可以把它们看作是相反的顺序,但实际上它们被从右到左推到堆栈上。很抱歉,这里的歧义,reference意味着一些关于这一点的文档,可能是你从中得到的源代码。那么,如何不读取无效的v呢在参数以相反顺序传递的情况下处理的值?@user590849:不是-由函数及其调用者来做正确的事情(例如,
printf()
被写入仅访问与格式字符串中的格式说明符对应的变量参数,
printf()的调用者)
负责为其使用的每个格式说明符提供参数)。“包括传递附加参数的数量-但以相反顺序传递参数意味着这不是必需的”我不知道如何“传递”相反顺序的参数允许编译器省略varg的数量。您能详细说明一下吗?@Flow:如果参数按相反顺序推送到堆栈中,那么当被调用函数回溯堆栈时,它会看到参数按其自然顺序-每次调用
va_arg()
只需在堆栈上再往上看一点就可以了。对,但这不是问题所在。为什么反向顺序允许您输入变量arg的数量,而不是非反向顺序。我假设在这两种情况下,被调用方都可以在到达基/帧指针之前遍历堆栈。