我们知道,C语言是调用者负责管理堆栈,所以实现有可变参数的函数。对于可变参数的函数,其压栈与清栈在编译时写在调用处,而其参数的使用则是被调用函数在运行时控制。那么,对于这个例子:
#include <stdio.h>
int main(int argc, char** argv)
{
double a = 1.2; // 8 bytes
float b = 3.4; // 4 bytes
printf("%f %f\n",a,b);
}
我想,它大概压栈的时候,先塞进去一个指针,再塞一个8字节的double,再塞一个4字节的float。但是当printf函数使用堆栈内容的时候,它的对后续参数的判断,应当仅仅依据我传过去的字符串模板。
那么,它是如何使用相同的两个模板(都是%f)识别不同的两个参数的(一个8字节,一个4字节)?