C语言学习中的变参处理
作者:网络转载 发布时间:[ 2013/2/19 10:42:41 ] 推荐标签:
在C语言中,我们都知道给函数传参,有传址调用和传值调用的差别。但是,很少有书籍、文章专门论述到,C语言的函数传参,还有另外一大类应用,是变参处理。举个例子,我们常用的printf函数,是典型的变参函数,它的参数不固定,可以使用格式化字符控制输出格式。这个大家可能都很熟悉。
变参函数用途很多,其通过设计,对外提供变参接口,允许上层业务层自由地通过格式化字符串来实现对自己输出行为的控制,这在很多debug和syslog日志输出场合很有用,我的书《0bug-C/C++商用工程之道》里面,第五章开篇在讲这个设计方法。这也是几乎所有C底层库进行格式化输出的基本手段。
关于如何使用C语言变参函数,实现有效的字符串格式化处理,我想大家可能很早学会了,但是,近期几个朋友问我问题,我才发现,很多人还是不了解如何设计变参函数。正好,近期我优化我的工程库,特别重新设计的变参函数的处理方法。我这里share一下,供大家参考。
还是那句话哈,一家之言,欢迎拍砖。
由于前期我很多博文,我的书《0bug-C/C++商用工程之道》,都大量讲过变参处理办法,我这里不细讲了,大家有兴趣,可以看看我的SafePrintf这个函数,这在过去很多博文中都出现过了,呵呵,算是“代码明星”了。
Code:
int SafePrintf(char* szBuf,int nMaxLength,char *szFormat, ...)
{
int nListCount=0;
va_list pArgList;
if (!szBuf) goto SafePrintf_END_PROCESS;
va_start (pArgList,szFormat);
nListCount+=Linux_Win_vsnprintf(szBuf+nListCount,
nMaxLength-nListCount,szFormat,pArgList);
va_end(pArgList);
if(nListCount>(nMaxLength-1)) nListCount=nMaxLength-1;
*(szBuf+nListCount)='