가변 파라메터 라고 해야 할 까요? 알기쉬운 이름을 정의하기가 쉽지는 않습니다. 흔히 불리는 arglist 라고 하겠습니다. Argument List 즉 ArgList를 사용하면 로그 파일을 생성 할 때 Format문을 쓰지 않고도 편리하게 사용 할 수 있다는 장점이 있습니다.또한 입력하는 Parameter가 가변적일 때 오버로딩 (Overloading)을 사용하지 않고도 간편하게 처리하는 방법을 제공합니다. 예제 코드를 보면 Format문과 같은 기능을 Method로 정의하고 사용할 수 있는 것을 볼 수 있습니다.
C# Code 는
WriteLog("Satrted Servie{0}", "Application"); 와 같이 사용합니다.
C++ Code 는 FormatStr("Satrted Servie%s", "Application"); 와 같이 사용합니다.
Log File 생성 및 기간이 경과한 파일 삭제
public class LogWriter
{
static Object thisLock = new object();
static String TgDir = Application.StartupPath + "\\Log";
/// Arglist를 이용해서 Log 파일 생성
public static void WriteLog(String format, params object[] arg)
{
lock (thisLock)
{
String fmt;
string appName = AppDomain.CurrentDomain.FriendlyName;
appName = appName.Substring(0, appName.IndexOf('.'));
string sDir = String.Format("{0}\\{1}_{2}.log", TgDir, appName, DateTime.Now.ToString("yMdHH"));
StreamWriter logs = new StreamWriter(sDir,true);
logs.AutoFlush = true;
fmt = DateTime.Now.ToString("yyyy-M-d HH:mm:ss ") + format;
logs.WriteLine(fmt, arg);
logs.Flush();
logs.Close();
}
}
/// 일정시간이 경과한 파일 삭제
public static void DeleteOldFile(int BeforDays)
{
try
{
TimeSpan tSpan;
if (!Directory.Exists(TgDir)) Directory.CreateDirectory(TgDir);
DirectoryInfo di = new DirectoryInfo(TgDir);
foreach (FileInfo item in di.GetFiles("*.log"))
{
WriteLog("{0}={1}",item.Name, item.LastWriteTime);
tSpan = DateTime.Now - item.LastWriteTime;
if (tSpan.Days> BeforDays) File.Delete(item.FullName);
}
}
catch(StackOverflowException e)
{
}
}
}
C++ Code 는 FormatStr("Satrted Servie%s", "Application"); 와 같이 사용합니다.
C++ Arglist 예
CString FormatStr(LPCSTR cs_str,...)
{
CString str="";
va_list args;
va_start(args, cs_str);
str.FormatV(cs_str, args);
va_end(args);
return str;
}
MSDN에 소개되어 있는 va_list 관련 소스
/* VA.C: The program below illustrates passing a variable
* number of arguments using the following macros:
* va_start va_arg va_end
* va_list va_dcl (UNIX only)
*/
#include
#define ANSI /* Comment out for UNIX version */
#ifdef ANSI /* ANSI compatible version */
#include
int average( int first, ... );
#else /* UNIX compatible version */
#include
int average( va_list );
#endif
void main( void )
{
/* Call with 3 integers (-1 is used as terminator). */
printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );
/* Call with 4 integers. */
printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );
/* Call with just -1 terminator. */
printf( "Average is: %d\n", average( -1 ) );
}
/* Returns the average of a variable list of integers. */
#ifdef ANSI /* ANSI compatible version */
int average( int first, ... )
{
int count = 0, sum = 0, i = first;
va_list marker;
va_start( marker, first ); /* Initialize variable arguments. */
while( i != -1 )
{
sum += i;
count++;
i = va_arg( marker, int);
}
va_end( marker ); /* Reset variable arguments. */
return( sum ? (sum / count) : 0 );
}
#else /* UNIX compatible version must use old-style definition. */
int average( va_alist )
va_dcl
{
int i, count, sum;
va_list marker;
va_start( marker ); /* Initialize variable arguments. */
for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )
sum += i;
va_end( marker ); /* Reset variable arguments */
return( sum ? (sum / count) : 0 );
}
#endif
Output
Average is: 3
Average is: 8
Average is: 0