可变参数的C函数:写可变参数的C函数要在程序中用到以下这些宏:
void va_start( va_list arg_ptr, prev_param );
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
va在这里是variable-argument(可变参数)的意思.
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个
头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数
参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值.
#include
#include
#include
#include
#include
#include
#include
#include
#define LOG_FILE_NAME "log.txt"
#define LOG_MAX_BAK_SIZE 8192*1024 /* 错误记录文件的最大容量 */
int get_file_size(char *filename) /*定义一个用来获取文件大小的函数*/
{
struct stat buf;
if(stat(filename, &buf)<0)
{
return 0;
}
return buf.st_size;
}
int writelog(int nLogLevel,char *pcFormat,...)
{
char szBuf[16];
char szRename[256];
int iRc=0;
memset(szBuf,0,sizeof(szBuf));
memset(szRename,0,sizeof(szRename));
time_t now;
now=time(NULL);
struct tm *tp;
tp =localtime(&now);
int iFileSize =0;
FILE *fp =NULL;
fp=fopen(LOG_FILE_NAME,"a+");
if(fp==NULL)
{
perror("open logfile");
exit(1);
}
chmod(LOG_FILE_NAME, 0755);//修改日志文件权限
iFileSize= get_file_size(LOG_FILE_NAME);
if (nLogLevel ==LOG_INFO ) {
strcpy(szBuf,"
}else if(nLogLevel==LOG_WARNING){
strcpy(szBuf,"
}else if(nLogLevel==LOG_ERR){
strcpy(szBuf,"
}else{
strcpy(szBuf,"~~~~~");
}
fprintf(fp,"%s %02d:%02d:%02d>",szBuf,tp->tm_hour,tp->tm_min,tp->tm_sec);
va_list argptr;
va_start(argptr,pcFormat);
vfprintf(fp,pcFormat,argptr);
va_end(argptr);
if (iFileSize >= LOG_MAX_BAK_SIZE)
{
sprintf(szRename,"%s.(%02d:%02d:%02d)",LOG_FILE_NAME,tp->tm_hour,tp->tm_min,tp->tm_sec);
if ((iRc = rename(LOG_FILE_NAME, szRename)) != 0)
{
printf("fatal error occured ! iRc= %d error_no is %d\n",
iRc,errno);
printf("writelog: %s CANNOT BE RENAMED !\n",LOG_FILE_NAME);
return(-1);
}
}
fclose(fp);
fp=NULL;
return(0);
}