2010年6月16日 星期三

[C] 不定長引數串列 Variable-length Argument Lists

習慣在 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 囉


沒有留言:

張貼留言