函数占用的是静态内存,因此需要提前告诉编译器占用内存大小,即调用时需要分配的栈空间,编译器主要是通过函数声明中描述的函数参数的个数以及类型,来计算参数所占用的栈空间。
既然是这样,那动态参数又是怎么实现的呢?C调用约定规定:由调用者把参数以从右向左的顺序压入栈中,并且由调用者清理堆栈中的参数,比如printf(char* format, arg1, arg2, ....),既然是调用者压入的参数,调用者知道栈中压入的参数情况,因此传入参数个数编译器在编译阶段就能确定下来。
image.png栈中的参数个数其实都是在格式化字符串中,格式化字符串中有多少个'%',那么就在栈中找多少次参数。
在gcc的头文件stdarg.h中定义了与函数的可变参数相关的3个宏va_start、va_end、va_arg,
网友评论