習慣在 Unix 環境上使用 fprintf 來進行 report ,然而,移到 Windows 時,這樣的做法並不適用,因此,有學長建議我使用Macro Definition 的方式來處理,如:
#ifdef WIN32_REPORT
#define err_report ...
#else
#define err_report fprintf
#endif
然而,我想到我使用 fprintf 時接的參數並不固定,導致轉移並不輕鬆,所以,我就來試試不定長引數串列啦!自己定義一個函數:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void do_err_report( FILE * out , ... )
{
va_list ap;
char *format , *string_value;
char report_buffer[2048+1];
int i , report_buffer_length = 2048;
report_buffer[report_buffer_length] = '\0';
va_start( ap , out );
for( i=0 , format = va_arg( ap , char *); *format && i < report_buffer_length ; format++ )
{
if( *format != '%' )
{
report_buffer[i++] = *format;
continue;
}
switch( *++format )
{
case 'd':
i += snprintf( report_buffer + i , report_buffer_length - i , "%d" , va_arg( ap , int ) );
break;
case 'f':
i += snprintf( report_buffer + i , report_buffer_length - i , "%f" , va_arg( ap , double ) );
break;
case 'c':
i += snprintf( report_buffer + i , report_buffer_length - i , "%c" , va_arg( ap , int ) );
break;
case 's':
i += snprintf( report_buffer + i , report_buffer_length - i , "%s" , va_arg( ap , char * ) );
break;
}
}
fprintf( out , "%s" , report_buffer );
va_end( ap );
}
int main()
{
do_err_report( stderr , "Hellow World %d @ %s \n" , 1 , "2010/06/16" );
return 0;
}
這樣下來,我就可以在自行處理啦!主要動作是先把要印的東西存在一個變數中,到時候看是要用 AfxMessageBox 或是輸出到 log 檔也 ok 囉
沒有留言:
張貼留言