请教C语言可变参数后面的类型如何能像printf函数那样,不是固定的,表达不清楚,希望有人可以懂小弟我的意思
请问C语言可变参数后面的类型怎么能像printf函数那样,不是固定的,表达不清楚,希望有人可以懂我的意思?
请问C语言可变参数后面的类型怎么能像printf函数那样,不是固定的,表达不清楚,希望有人可以懂我的意思?
------解决思路----------------------
没有什么高深的东西,声明函数的时候用 ... 就代表它接受可变参数了。
实现的时候,调用方会把实际传递的参数按照从右到左的顺序 push 到堆栈里面(可变参数只能使用 cdecl, 不能使用 stdcall 的),函数里面只要获得了第一个参数的地址,加上第一个参数的大小就可以获得第二个参数的地址了,后面的参数一样,只要知道了前面个参数的地址后大小,就可以得到后面一个参数了。
在 printf 中,每一个参数的大小是由其中的 %d 这种类型来获取的,实际上,绝大多的类型在传递的时候都是按 4 个字节来传递的。
在上面的基础上,标准库定义的一组处理可变参数的宏其实是很简单的。
va_list argptr; // 定义一个指针
va_start(argptr, i); // 通过第一个固定参数的地址来初始化指针为可变参数的起始地址
int n = va_arg( argptr, int ); // 取出一个值,并把指针加上这个类型的大小
va_end(argptr); // 把指针置为 NULL
------解决思路----------------------
File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\printf.c"
62: retval = _output_l(stdout,format,NULL,arglist);
File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c"
940: int __cdecl _output_l (
请问C语言可变参数后面的类型怎么能像printf函数那样,不是固定的,表达不清楚,希望有人可以懂我的意思?
------解决思路----------------------
没有什么高深的东西,声明函数的时候用 ... 就代表它接受可变参数了。
实现的时候,调用方会把实际传递的参数按照从右到左的顺序 push 到堆栈里面(可变参数只能使用 cdecl, 不能使用 stdcall 的),函数里面只要获得了第一个参数的地址,加上第一个参数的大小就可以获得第二个参数的地址了,后面的参数一样,只要知道了前面个参数的地址后大小,就可以得到后面一个参数了。
在 printf 中,每一个参数的大小是由其中的 %d 这种类型来获取的,实际上,绝大多的类型在传递的时候都是按 4 个字节来传递的。
在上面的基础上,标准库定义的一组处理可变参数的宏其实是很简单的。
va_list argptr; // 定义一个指针
va_start(argptr, i); // 通过第一个固定参数的地址来初始化指针为可变参数的起始地址
int n = va_arg( argptr, int ); // 取出一个值,并把指针加上这个类型的大小
va_end(argptr); // 把指针置为 NULL
------解决思路----------------------
File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\printf.c"
62: retval = _output_l(stdout,format,NULL,arglist);
File: "C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c"
940: int __cdecl _output_l (