可变参数原理

2019-07-20  本文已影响0人  今天不想掉头发

函数占用的是静态内存,因此需要提前告诉编译器占用内存大小,即调用时需要分配的栈空间,编译器主要是通过函数声明中描述的函数参数的个数以及类型,来计算参数所占用的栈空间。

既然是这样,那动态参数又是怎么实现的呢?C调用约定规定:由调用者把参数以从右向左的顺序压入栈中,并且由调用者清理堆栈中的参数,比如printf(char* format, arg1, arg2, ....),既然是调用者压入的参数,调用者知道栈中压入的参数情况,因此传入参数个数编译器在编译阶段就能确定下来。

image.png

栈中的参数个数其实都是在格式化字符串中,格式化字符串中有多少个'%',那么就在栈中找多少次参数。

在gcc的头文件stdarg.h中定义了与函数的可变参数相关的3个宏va_start、va_end、va_arg,

上一篇 下一篇

猜你喜欢

热点阅读