va_start,va_arg,va_end的用法
來源:http://topic.csdn.net/t/20030418/20/1680144.html
標頭檔案<stdarg.h> 按照 ANSI C 標準中的規範說明, 以 <stdarg.h> 為介面的庫包含著幾個函式的巨集, 它們提供了一種可移植的方法來控制可變引數表。注意: 不是任何 C 編譯器都支援標頭檔案 <stdarg.h>, 僅僅那些遵照 ANSI C 標準的才支援這個檔案。標頭檔案 <stdarg.h> 說明了一個型別並定義了三個巨集, 用來處理被調函式引數個數和型別未知的引數表。
例子:
#include<stdarg.h>
#include<stdio.h>
void errmsg(int code,...)
{
va_list argptr;
char *fmt;
va_start(argptr,code);//在訪問任何未知引數之前argptr必須用巨集va_start來初始化一次
if(code &FILENAME)
fprintf(stderr,"%s:",argptr,char *));
if(code &LINENUMBER)
fprintf(stderr,"%s:",argptr,int));
if(code&WARNING)
fputs("warning:",stderr);
fmt=va_arg(argptr,char*);
fprintf(stderr,fmt,va_arg(argptr,char *));
va_end(argptr);//引數處理完畢後,並且在退出errmsg()之前, 個巨集被呼叫一次
}
stdarg.h - handle variable argument list
#include <stdarg.h>
#define MAXARGS 31
int execl (const char *file, const char *args, ...)
{
va_list ap;
char *array[MAXARGS];
int argno = 0;
va_start(ap, args);
while (args != 0) {
array[argno++] = args;
args = va_arg(ap, const char *);
}
va_end(ap);
return execv(file, array);
}
來源:http://msdn.microsoft.com/zh-cn/library/kb57fad8.aspx