#define (format, ...)
От: Аноним  
Дата: 10.06.08 13:04
Оценка:
В чужих сырцах есть такое определение, которое MS VS7 отказывается считать допустимым:

#define gdTestErrorMsg(format, ...) _gdTestErrorMsg(__FILE__, __LINE__, format, ## __VA_ARGS__)

error C2010: ')' : unexpected in macro formal parameter list


это как-то можно подлечить?
Спасибо.
Re: #define (format, ...)
От: Vain Россия google.ru
Дата: 10.06.08 13:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В чужих сырцах есть такое определение, которое MS VS7 отказывается считать допустимым:

А>
А>#define gdTestErrorMsg(format, ...) _gdTestErrorMsg(__FILE__, __LINE__, format, ## __VA_ARGS__)
А>

А>

А>error C2010: ')' : unexpected in macro formal parameter list

А>это как-то можно подлечить?
__VA_ARGS__ появилось вроде только в VS8 (2005), поэтому никак.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: #define (format, ...)
От: Кодт Россия  
Дата: 10.06.08 13:39
Оценка: :)
Здравствуйте, <Аноним>, Вы писали:

Можно вместо функции сделать замыкание — временный объект с методом:
// исходный API
void _gdTestErrorMsg(const char* file, int line, const char* format, ...);
void _gdTestErrorMsg(const char* file, int line, const char* format, va_args); // без этой функции придётся туго

// добавляем замыкание
struct CTestErrorMsg
{
    const char* file;
    int line;
    
    CTestErrorMsg(const char* f, int l) : file(f), line(l) {}
    void apply(const char* format, ...) const // или operator(), если больше нравится
    {
        va_list args;
        va_start(args, format);
        _gdTestErrorMessageV(file, line, format, args);
        va_end(args);
    }
};

#define gdTestErrorMsg /*(format,...)*/ CTestErrorMsg(__FILE__,__LINE__).apply /*(format,__VA_ARGS__)*/
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: #define (format, ...)
От: StevenIvanov США  
Дата: 10.06.08 14:13
Оценка: 45 (4)
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:

...
если на С можно так:


static void d(const char * f, ...)
{
    //printf-like functionality
}


typedef void (* d_pfn)(const char * f, ...);

static d_pfn use_d( const char * file, int line )
{
    d( "[%s]%d: ", file, line );
    return &d;
}

#define DBG use_d(__FILE__, __LINE__)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.