C语言中可变参数的用法
头文件stdarg.h,对实现可变参数函数提供三个宏和一种隐式的数据类型。
void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
标准Win32或者Linux提供了非常简单的处理办法:
void DebugStringOut(const char *Name, int Line, va_list arg_list, ...)
{
static char output[1000];
sprintf(output, "%s::%d ", Name, Line);
int s_pos = strlen(output);
va_list arg_ptr;
char *format;
va_start(arg_ptr, arg_list);
format = (char *)(arg_list);
vsprintf((output+ s_pos), format, arg_ptr);
s_pos = strlen(output);
sprintf((output+ s_pos), "\n");
// 处理 output 字符串
printf(output);
va_end(arg_ptr);
}
但是嵌入式Linux一般不支持 va_list arg_list 作为参数
void DebugStringOut(const char *Name, int Line, const char *fmt, ...)
{
static char output[1000];
sprintf(output, "%s::%d ", Name, Line);
int s_pos = strlen(output);
va_list ap;
va_start(ap, fmt);
vsnprintf(output+ s_pos, sizeof(output)- s_pos- 1, fmt, ap);
va_end(ap);
s_pos = strlen(output);
sprintf((output+ s_pos), "\n");
// 处理 output 字符串
printf(output);
}
调用函数方法
// 输出函数名与在文件中的行数
DebugStringOut(__FUNCTION__, __LINE__, "测试字符串 %s int=%d char=%c", "stirng", 100, 'A');