数码资讯
浅谈变参数函数的基本原理
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
对于可变参数函数来获得它们的变量参数,我们可以使用以下宏获得:
#包括
无效va_start(va_list AP,最后);
型va_arg(va_list AP型);
无效va_end(va_list美联社);
无效va_copy(va_list dest,va_list SRC);
如果不理解实现原理,如何使用这些宏总是很难记住,因此有必要澄清变参数函数的基本原理。
无效variable_argument_func(int int arg1,arg2,…)
{
我们应该如何获得变量参数。
首先我们要明白他们靠近arg0,arg1存储在函数的调用栈。
/ /从低到高的arg1-arg2变量参数1参数2 -变参数n。
我们假设编译器是对这些变量的连续存储,没有对齐限制。
如果要获得每个变量,我们需要知道它们的第一个地址,每种类型的变量。
int VA1;
int VA2;
int VA3;
void * va_p = 2 + 1; / /最后的固定变量,得到的第一个地址的变量参数
VA1 =(va_p *(int *)); / /顺序为每个变量
va_p = sizeof(int);
VA2 = *((int *)va_p);
va_p = sizeof(int);
VA3 = *((int *)va_p);
}
我们可能会注意到,上述所有使用int变量,因为它符合先前的假设:所有参数的连续存储,如果参数中包含其他非4字节对齐的变量,类似于上面的方法会犯错,这些特性取决于编译器,所以我们应该用stdarg H宏。,我们的目的是了解实施的原则,只是。
#包括
无效va_start(va_list AP,最后);
型va_arg(va_list AP型);
无效va_end(va_list美联社);
无效va_copy(va_list dest,va_list SRC);
如果不理解实现原理,如何使用这些宏总是很难记住,因此有必要澄清变参数函数的基本原理。
无效variable_argument_func(int int arg1,arg2,…)
{
我们应该如何获得变量参数。
首先我们要明白他们靠近arg0,arg1存储在函数的调用栈。
/ /从低到高的arg1-arg2变量参数1参数2 -变参数n。
我们假设编译器是对这些变量的连续存储,没有对齐限制。
如果要获得每个变量,我们需要知道它们的第一个地址,每种类型的变量。
int VA1;
int VA2;
int VA3;
void * va_p = 2 + 1; / /最后的固定变量,得到的第一个地址的变量参数
VA1 =(va_p *(int *)); / /顺序为每个变量
va_p = sizeof(int);
VA2 = *((int *)va_p);
va_p = sizeof(int);
VA3 = *((int *)va_p);
}
我们可能会注意到,上述所有使用int变量,因为它符合先前的假设:所有参数的连续存储,如果参数中包含其他非4字节对齐的变量,类似于上面的方法会犯错,这些特性取决于编译器,所以我们应该用stdarg H宏。,我们的目的是了解实施的原则,只是。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。