我觉得像printf()这样的函数并没有限制参数的数量。
但是在Solaris上调试程序时,我注意到它会将最多5个参数压入堆栈,如果有超过5个参数,将使用通用寄存器。
那么即使普通寄存器在printf等功能上还不够,会发生什么?编译器是否为我做了什么?
答案 0 :(得分:4)
该行为由平台的ABI控制。如果寄存器中的参数多于适合的参数,则它们将以不同的方式处理。可以传递的参数数量没有简单的上限,因此编译器和ABI定义了一个适用于相关硬件的机制。在SPARC上有效的方法不一定适用于例如Intel IA32。
答案 1 :(得分:0)
通常,ABI使用寄存器进行参数传递的平台切换到可变参数函数的不同调用约定,从而将所有内容传递到堆栈上。这就是为什么C标准指定未定义的行为来调用没有原型的可变参数函数;没有原型,在这样的平台上,编译器将生成一个不正确的调用。
应该注意的是,某些平台使用更复杂(无用的复杂,我会说)的方法将参数传递给可变参数函数,例如构造一种链表并将隐藏指针传递给该列表,其中执行然后va_start
能以某种方式获得。作为一名程序员,你应该把整个stdarg.h
的东西视为一个能达到预期目标的黑盒子,并祈祷你永远不必看到一些丑陋的实现的精彩细节......