本文主要是介绍c/c++ 变参,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
从写了好几年的java转到写c上来,充分的理解到了一句话“由俭入奢易,由奢入俭难”。习惯了java中的API和设计以及强大的JIT编译器和对语法的理解,对于C++实在是有点觉得设计者脑残,比如变参。变参的使用方式如下,其中变参表示待累加的参数
int/*calculate_status*/ add(int* sum/*result*/,...){
va_list vas;
va_start(vas,sum);
Int tmpSum=0;
int va=va_arg(vas,int);
while(va!=0){
tmpSum+=va;
va=va_arg(vas,int);
}
*sum=tmpSum;
return SUCC;
}
C++中有一系列的变参函数:
printf,sprintf,snprint,以及系统调用syslog。
想实现一个自己的打日志的方法,好统一日志的输出方式,简易的实现便是包装一下syslog,在此过程中出现一些问题。
printLog(int level,const char* format,...);
1)无法直接传递变参。也就是...无法直接传递给syslog.也无法通过如下方式调用:
va_start(va_list,format);
syslog(level,format,va_list);
va_end(va_list);
只能通过如下解释的方式
char buf[1024];
va_list valist;
va_start(valist,format);
vsnprintf(buf,1024,format,valist);
va_end(valist);
2)在调用syslog()的过程中,直接调用syslog(level,buf)会有如下警告:
warning: format not a string literal and no format arguments [-Wformat-security]
也就是说format中并没有占位符的参数。虽然说只是一个warn,但是总归不爽,只好脱了裤子放下屁:
syslog(level,"%s",buf);
立马解决了。
虽然大多数问题,是因为回过头来成为一个c++新手,但是不得不吐槽一下,和java比起来,编译器弱爆了。
这篇关于c/c++ 变参的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!