Нужен трюк с эллипсисом и va_args - PullRequest
3 голосов
/ 23 апреля 2011

TraceMessage - это функция WinAPI с переменным числом аргументов. Это функция трассировки с нотацией, аналогичной printf, которая генерирует сообщение трассировки в трассировке Windows. Странная часть здесь в том, что она получает строку формата как часть многоточия, а не как выделенный аргумент. Можно «переопределить» эту функцию моей собственной функцией, которая затем должна вызвать TraceMessageVa (то же самое, что TraceMessage, только с va_args, а не с многоточием).

Пока все хорошо; но теперь я хочу получить доступ к отслеживаемому сообщению, используя sprintf -подобную функцию, у которой есть строка формата из многоточия. Таким образом, мне нужно
- получить аргумент форматной строки из многоточия;
- создать новый va_list без первого аргумента.

Есть идеи о том, как это сделать? Решения, специфичные для компилятора Visual Studio, также приемлемы. Спасибо!

1 Ответ

4 голосов
/ 23 апреля 2011

С помощью va_list вы можете передать его функции, которая принимает va_list после того, как уже использовала va_arg, чтобы извлечь один или несколько аргументов.va_list будет тогда действовать так, как будто «содержит» только остальные аргументы.

У меня нет опыта работы с TraceMessage, но я привел пример, использующий стандарт vprintf и тестфункция.Вы должны быть в состоянии адаптироваться соответствующим образом.

Например

#include <stdio.h>
#include <stdarg.h>

void test(int a, ...)
{
    va_list va;
    const char* x;

    va_start(va, a);
    x = va_arg(va, const char*);

    vprintf(x, va);

    va_end(va);
}

int main(void)
{
    test(5, "%d\n", 6);
    return 0;
}
...