在linux下的开源项目里,特别是用C/C++编写的程序,一般都有debug.h、debug.c文件,这个文件里的函数格式都差不多,格式一般如下:
DebugMessagePrint(char *fmt,...);//注意是三个点省略号。
或者DebugMessagePrint(...,char *fmt,...);//第一个省略号的参数确定,第二个省略号不确定,有fmt格式确定。
上面的函数里面的内容大体如下;
DebugMessagePrint(char *fmt,...)
{
char buf[MAX-SIZE];
va_list ap;
///....................
va_start(ap,fmt);
snprintf(buf,MAX-SIZE,fmt,ap);
va_end(ap);
}
ps:va_list,va_start,va_end工作原理探究
大家都知道不同的编译器对函数调用规约(calling convention)很多时候不同,但默认都是_cdecl调用规约,(调用规约一般有三种,_cdecl ,__stdcall等,它是用来做一些动作,比如在编译时让函数参数入栈顺序(是坐到右,还是右到左入栈)、产生函数名用不同的格式)。gcc是用__cdecl调用规约,即参数右到左入栈的方式。
详细见:http://www.cppblog.com/qiujian5628/archive/2008/01/21/41562.html