在c和c++中,可变参数使用的最多函数有:scanf,printf,以及fprintf,fscanf,sprintf等,MFC也提供CString::Format实现可变参数。
本示例通过va_list来实现自己的可变参数函数,实现程序写日志功能。
通过可变参数实现日志打印//ForATest.cpp : 定义控制台应用程序的入口点。
#include"stdafx.h"
#include"Windows.h"
#include"iostream"
usingnamespacestd;
#include"string"
#include<stdio.h>
#include<stdarg.h>
#definePL_ERROR -2
#defineSERVICE_ERROR(strMod, ulErrCode, cFormat, ...)
logRecord(FUNCTION, LINE, strMod, PL_ERROR, ulErrCode, cFormat, VA_ARGS);
staticstringTestIT_MODULE="TestItMe";
voidlogRecord(stringstrFunc,
intiLine,
stringstrMod,
intiLevel,
intiErrCode,
charcFormat,
...)
{
stringstrLog;
strLog.clear();
characBuffer1[255], acBuffer2[255];
sprintf_s(acBuffer1,254,"[%s] [%d] [%s] [%d] [%d]", strFunc.data(), iLine, strMod.data(), iLevel, iErrCode);
va_list args;
va_start (args, cFormat);
vsprintf(acBuffer2,cFormat, args);
FILEpFile=fopen("C:\log.txt","a+");
if(NULL==pFile)
return;
fprintf(pFile, acBuffer1);
fprintf(pFile, acBuffer2);
fprintf(pFile,"n");
fclose(pFile);
va_end(args);
}
int_tmain(intargc, _TCHAR*argv[])
{
stringstrFileName="C:\Intel\Logs";
SERVICE_ERROR(TestIT_MODULE,-1,"GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());
}sprintf_s的一个示例#include<stdio.h>
#include"string"
#include"iostream"
usingnamespacestd;
intmain(void)
{
charbuffer[200], s[]="computer", c='l';
inti=35, j;
floatfp=1.7320534f;
stringname="hello";
//Format and print various data:
j=sprintf_s( buffer,200,"String: %sn", s );
j+=sprintf_s( buffer+j,200-j,"Character: %cn", c );
j+=sprintf_s( buffer+j,200-j,"Integer: %dn", i );
j+=sprintf_s( buffer+j,200-j,"Real: %fn", fp );
j+=sprintf_s( buffer+j,200-j,"Name: %sn", name.data() );
printf_s("Output:n%sncharacter count = %dn", buffer, j );
}C++ version
// AssistTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "cstdio"#include "iostream"#include "string"#include "fstream"#include "cstdarg"#include "windows.h"using namespace std;const int OP_SUCCESS = 0;const int OP_FAILED = -1;static string TestIT_MODULE = "TestItMe";#define SERVICE_ERROR(strMod, ulErrCode, cFormat, ...) logRecord(__FUNCTION__, __LINE__, strMod, ulErrCode, cFormat, __VA_ARGS__);//print log modulevoid logRecord(string strFunc, int iLine, string strMod, int iErrCode, char* cFormat, ...){ string strLog; strLog.clear(); char acBuffer1[255], acBuffer2[255]; sprintf_s(acBuffer1, 254, "[%s] [%d] [%s] [%d] ", strFunc.data(), iLine, strMod.data(), iErrCode); va_list args; va_start (args, cFormat); vsprintf(acBuffer2,cFormat, args); ofstream ofLogFile; ofLogFile.open("F:\log.txt", ios::out | ios::app); if (!ofLogFile) { return; } string strBuffer1, strBuffer2; strBuffer1 = acBuffer1; strBuffer2 = acBuffer2; ofLogFile.write(strBuffer1.data(), strBuffer1.size()); ofLogFile.write(strBuffer2.data(), strBuffer2.size()); ofLogFile.put('n'); ofLogFile.close(); va_end(args);}int main(int argc, char* argv[]){ string strFileName = "C:\Intel\Logs"; SERVICE_ERROR(TestIT_MODULE, -1, "GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());}
C++ version 2
// AssistTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "cstdio"#include "iostream"#include "string"#include "fstream"#include "cstdarg"#include "windows.h"using namespace std;const int OP_SUCCESS = 0;const int OP_FAILED = -1;static string TestIT_MODULE = "TestItMe";class mt{public: void LogRecord(string strFunc, unsigned int uiLine, string strMod, int iulErrCode, char* cFormat, ...); //print log module};void mt::LogRecord(string strFunc, unsigned int uiLine, string strMod, int iErrCode, char* cFormat, ...){ string strLog; strLog.clear(); char acBuffer1[255], acBuffer2[255]; sprintf_s(acBuffer1, 254, "[%s] [%d] [%s] [%d] ", strFunc.data(), uiLine, strMod.data(), iErrCode); va_list args; va_start (args, cFormat); vsprintf(acBuffer2,cFormat, args); ofstream ofLogFile; ofLogFile.open("F:\log.txt", ios::out | ios::app); if (!ofLogFile) { return; } string strBuffer1, strBuffer2; strBuffer1 = acBuffer1; strBuffer2 = acBuffer2; ofLogFile.write(strBuffer1.data(), strBuffer1.size()); ofLogFile.write(strBuffer2.data(), strBuffer2.size()); ofLogFile.put('n'); ofLogFile.close(); va_end(args);}int main(int argc, char* argv[]){ string strFileName = "C:\Intel\Logs"; mt m1; m1.LogRecord(__FUNCTION__, __LINE__ ,TestIT_MODULE, -1, "GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());}
参考
[1] http://www.cplusplus.com/reference/clibrary/cstdio/vsprintf/
[2] http://www.cnblogs.com/stuarts/archive/2010/08/03/1791598.html
[3] http://www.cnblogs.com/mydomain/archive/2010/07/27/1785667.html
讲述了了va_start等可变参数的基本概念及定义
原文链接: https://www.cnblogs.com/mydomain/archive/2010/12/06/1898140.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/18375
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!