В чужих сырцах есть такое определение, которое MS VS7 отказывается считать допустимым:
#define gdTestErrorMsg(format, ...) _gdTestErrorMsg(__FILE__, __LINE__, format, ## __VA_ARGS__)
error C2010: ')' : unexpected in macro formal parameter list
это как-то можно подлечить?
Спасибо.
Здравствуйте, Аноним, Вы писали:
А>В чужих сырцах есть такое определение, которое 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.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, <Аноним>, Вы писали:
Можно вместо функции сделать замыкание — временный объект с методом:
// исходный 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>>
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, <Аноним>, Вы писали:
...
если на С можно так:
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__)