2010-08-13 36 views
2

对我来说,像printf()这样的函数并没有限制参数的数量。如何在不限制参数数量的函数中传递参数?

但是,当在Solaris上调试程序时,我注意到它会将最多5个参数压入堆栈,如果有超过5个参数,将使用通用寄存器。

那么即使普通的寄存器在printf这样的函数中也不够用,会发生什么呢?编译器为我做了些什么?

回答

4

行为由平台的ABI控制。如果参数比参数寄存器更多,那么它们将以不同的方式处理。对于可以传递的参数数量没有简单的上限,所以编译器和ABI定义了一种适用于所讨论的硬件的机制。例如,Intel IA32不一定适用于SPARC。

0

通常情况下,ABI使用寄存器传递参数的平台切换到不同的可变参数调用约定,从而一切都在栈上传递。这就是为什么C标准将未定义行为分配给没有原型的调用可变参数函数的原因;如果没有原型,编译器会在这样的平台上产生不正确的调用。

应该指出的是,一些平台使用更复杂的(无用的复杂的,我会说)将参数传递给可变参数函数的方法,比如构造一种链接列表并将隐藏指针传递给该列表, va_start然后以某种方式能够获得。作为程序员,你应该把整个stdarg.h作为一个黑盒子来处理,并且祈祷你永远不必看到一些丑陋的实现的细节...