开发工具:
文件大小: 72kb
下载次数: 0
上传时间: 2019-07-15
详细说明:keil C51可变参数讲解,自定义允许访问可变长度参数列表的函数。MASQENO
举例说明
示例代码1
void Test int a
va list ap
va start( ap, a
b= va arg( ap, int )
va end( ap )
printf(%d, a, b)
1.首先定义一个 va list型的变量ap,也就是char
2. va star(ap,a)宏替换之后就是ap=(a_lst&a+ sizeof(a);
首先取a的地址,即第一个固定参数的地址,然后强制类型转换为
va list,接着后移
的内存大小,把当前这个地址值赋给ap。很明显,就是第一个参数a后面的那个地方,按
照上面说的,也就是第一个可变参数。即现在把ap指向第一个可变参数
3.b= va arg(ap,int)宏替换为b=(nt)ap)+0];
自加在后,因此是获取第一个参数的值赋给b,然后ap后移一个类型的位置,即指向
下一个元素的地址
4.va_end(ap),这里什么都没有做,在ADS那个版本里是将ap指向NUL,防止误操作
那么按照这种做法,当用 mytest(100,200);调用这个函数时,它将可以打印出100
200。如果用 mytest(100,200,300);调用这个函数,仍然只是显示100,200。如果要将300
打印出来,那么得再使用一次va_arg宏,把它赋值给变量c,把c打印出来。
所以 stdarg里的几个宏只是机械的把每个参数读出来,它甚至不知道现在读的是什么类
型的变量,如果要读下一个变量的话得往后跳多少位置,这些都只能靠程序自己来判断指示。
所以 printf里的格式符号"‰d,%s%c”之类的都是人为规定的,得自己编程识别这些格
式。
ASZENO Confidential
Kil
2012-08-09
MAENO
示例代码2
#include
#include
/ for printf *
int varfunc (char *buf, int id, ..
va start (tag, id)
if(d==0)
char arg2
3
arg1 = va arg( tag, int);
arg2 va arg(tag, char
arg3
arg (tag, long)
else
char arg 1:
char * arg2
long arg3
arg 1 =va arg (
arg2 va arg (tag, char *)
arg3
arg(tag, long
void caller (void)
char tmp buffer [10]
varfunc( tmp buffer, 0, 27, Test Code",100L);
varfunc(tmp buffer,
8L);
ASZENO Confidential
Kil
2012-08-09
MASQENO
四、结论
函数形参列表中的变量在内存中的位置是顺次排列的。
ASZENO Confidential
Kil
2012-08-09
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.