深入浅出函数的使用技巧物业
民生视野 2021-08-25 01:55 字号: 大 中 小
五、 Unix System V兼容方式的va声明
上面介绍可变参数函数的声明是采用ANSI标准的,Unix System V兼容方式的声明有一点点区别,它增加了两个宏:va_alist,va_dcl。而且它们不是定义在stdarg.h中,而是varargs.h中。stdarg.h是ANSI标准的;varargs.h仅仅是为了能与以前的程序保持兼容而出现的,现在的编程中不推荐使用。
va_alist:函数声明/定义时出现在函数头,用以接受参数列表。
va_dcl:对va_alist的声明,其后无需跟分号\";\"
va_start的定义也不相同。因为System V可变参数函数声明不区分固定参数和可选参数,直接对参数列表操作。所以va_start()不是va_start(ap,v),而是简化为va_start(ap)。其中,ap是va_list型的参数指针。
Unix System V兼容方式下函数的声明形式:
type VAFunction(va_alist)
va_dcl // 这里无需分号
{
// 函数体内同ANSI标准
}
泡绿茶一般不盖盖子 // 例3:猜测execl的实现(Unix System V兼容方式),摘自SUS V2
#include #define MAXARGS 100/ * execl(file, arg1, arg2, ..., (char *)0); */execl(va_alist)va_dcl{ va_list ap; char *file; char *args[MAXARGS]; int argno = 0; va_start(ap); file = va_arg(ap, char *); while ((args[argno++] = va_arg(ap, char *)) != (char *)0) ; va_end(ap); return execv(file, args);}
六、 扩展与思考
个数可变参数在声明时只需\"...\"即可;但是,我们在接受这些参数时不能\"...\"。va函数实现的关键就是如何得到参数列表中可选参数,包括参数的值和类型。以上的所有实现都是基于来自stdarg.h的va_xxx的宏定义。 思考能不能不借助于va_xxx,自己实现VA呢?,我想到的方法是汇编。在C中,我们当然就用C的嵌入汇编来实现,这应该是可以做得到的。至于能做到什么程度,稳定性和效率怎么样,主要要看你对内存和指针的控制了。
参考资料
EE和OpenGroup联合开发的Single Unix specification Ver3;BR
nux man手册;
3.x86汇编,还有一些安全编码方面的资料。
查看本文来源
银川治疗妇科医院太原治疗子宫内膜炎费用
柳州白癜风哪好
-
-
巴神点拨老东家米兰该醒醒了最该买的人是他
巴神点拨老东家:米兰该醒醒了!最该买的人是他巴神:米兰...
2020-07-12 | 民生视野
-
-
贵州体育局开展2018至2019雪季冰雪
贵州体育局开展2018至2019雪季冰雪场所安全检查贵州省体育局...
2020-07-08 | 民生视野
-
-
包装变脸吓人一跳
包装“变脸” 吓人一跳 马硕 报道现在市面上的饮料是真不少...
2019-07-15 | 民生视野
-
-
钢城区大力宣传双拥政策
钢城区大力宣传双拥政策钢城区注重教育引导,努力做到“四...
2019-07-07 | 民生视野
-
-
市委组织部召开全市非公企业和社会组织党建
市委组织部召开全市非公企业和社会组织党建特派员动员暨培...
2019-07-07 | 民生视野
-
-
营养土不营养黄瓜苗难生长
营养土不营养 黄瓜苗难生长 记者 齐坤 报道 石家庄藁城...
2019-07-06 | 民生视野