Обернуть макрос с переменным количеством аргументов

Мне нужно обернуть макрос, чтобы к нему можно было получить доступ с помощью функции. Макрос определяется как:

#define gDbgLog(fmt,...)  dbgLog(g_pdbg,MODULE_NAME,__FUNCTION__,fmt,##__VA_ARGS__)

и я попытался обернуть это так:

void pMonDbgLog(char* fmt, ...)
{
    va_list args;
    va_start(args,fmt);
    gDbgLog(fmt,args);
    va_end(args);
}

в то время как fmt, похоже, проходит нормально, аргументы (int), похоже, забиваются. Я называю это так:

int x = 51144;
pMonDbgLog("some text %d",x);

и я получаю "какой-то текст 642129608" при прямом вызове макроса, например DbgLog("some text %d",x);, работает нормально. Почему это?

dbgLog() оборачивает vsnprintf() для создания выходных данных.


person stdcerr    schedule 12.08.2016    source источник
comment
Похоже, что для вашего примера использования вы можете напрямую вызвать макрос, то есть gDbgLog("some text %d",x);. Как вы думаете, зачем вам нужна функция-оболочка?   -  person bgoldst    schedule 13.08.2016


Ответы (1)


обернуть макрос с переменным количеством аргументов

Просто невозможно «расширить» valist до переменного числа аргументов и передать их функциям с переменным числом аргументов во время выполнения, по крайней мере, без каких-либо дополнительных помощников (которые не являются частью C, не переносимы и, возможно, не быть доступной для вас реализации/платформы).

gDbgLog() ожидает передачи каждого аргумента отдельно:

gDbgLog("%s %d", "hello, world", 42);

Вместо этого код, который вы показываете, передает ровно один параметр в качестве части __VA_ARGS__, а именно значение valist.

gDbgLog(fmt,args);

Как это решить?

dbgLog() оборачивает vsnprintf() для генерации вывода.

Так что просто отбросьте gDbgLog() и вызовите vsnprintf() из pMonDbgLog(), напрямую передав valist как инициализированный фрагментом кода, который вы показываете.

person alk    schedule 13.08.2016