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++ 变参)