在内网代码中出现saveasser(const char *x_format,...)不解
这个知识点有关与函数重载。C++中有函数重载这种方法,以供我们调用时可以不确定实参的个数,其实 C 语言也可以,而且更高明!
我们在stdio.h 中可以看到 PRintf() 函数的原型:
int printf(char * format,...)
事实上,我们如果要写这样的函数也可以类似的写,那么在定义函数时用上这个符号“ ... ” ,它叫占位符,喊它“ 三个点 ” 也可以,只要你愿意!那么我可以这样定义我的函数:
fun(int a,...){ }
va_listva_arg()va_start()
这三个很重要。
在调用函数时,程序同样会把实参传入,在函数存储区保存起来,如果有很多参数,将一起保存起来。
这时候就要用到va_list 了,这是个类型定义,我们可以把它理解成一个指针,它指向第一个参数的地址
如果,我们这样定义: va_list pp ;
则pp 就是这样一种变量,它是指向所有参数中的第一个参数的。它不同于一般的指针变量,它是个复合变量,
如果这样写:va_start(pp,a);
那么pp 就指向第一个参数 a 了,并且可得到 a 的类型 int 。
这时候如果有下一个参数,就需要使pp 指向下一个参数,并且得到它的类型。同样需要使用函数来实现,这个函数是: va_arg()
下面我们看一个简单的例子:
#include <stdio.h>
#include<stdarg.h>
void fun(int a,...)
{
va_list pp;
int n=1;//使用 n 计量参数个数
va_start(pp,a);
do
{
printf("第 %d 个参数 =%d/n",n++,a);
a=va_arg(pp,int);//使 pp 指向下一个参数,将下一个参数的值赋给变量 a
}
while (a!=0);//直到参数为 0 时停止循环
}
main()
{
fun(20,40,60,80,0);
}
注意!
一定要有上面两个文件包含命令,因为程序中用到的那3个小东东都在那个文件里。其实真正意义上应该说那是函数,实质上那不过是两个宏,呵呵。
新闻热点
疑难解答