2013-12-01 6 views
0

У меня есть несколько применений одного типа отладочной инструкции в моем коде - скажем DEBUG("abcd"); или DEBUG("abc %d def", val), которые переводятся и печатаются в файл.Использование макросов для преобразования заявлений печати

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

WRITE(char *string); 

Использование: WRITE(L"abcd") и т.д .. Поскольку использование этого отладочного утверждения Огромный, я надеюсь использовать макросы, чтобы конвертировать то же самое. Это можно сделать; также учитывая, что функция DEBUG используется для определения спецификаторов формата?

+1

вопрос немного запутанный. Можете ли вы дать нам пример того, чего вы пытаетесь достичь? –

+0

Ok Мне нужно преобразовать операторы Debug() в операторы Write(). Потому что использование операторов Debug огромно; Я хочу использовать макрос для преобразования всего за один раз. Debug() принимает строку в качестве входных данных, также с помощью спецификаторов формата. Я ищу, чтобы иметь возможность конвертировать то же самое в одну строку, которую нужно использовать Write(). Также есть элемент unicode/ansi, для которого мне нужно использовать L "" в моей функции Write. Пытается что-то вроде - #define DEBUG (string) WRITE (L "string") не будет работать для тех, у которых есть спецификаторы формата. – ArunR

+0

конвертировать на уровне кода? –

ответ

0

Может быть, вы смотрите на: #define DEBUG(str,...) WRITE(str,__VA_ARGS__)

0

Вы, вероятно, хотите что-то вроде ГНУ функции

int asprintf(char **strp, const char *fmt, ...); 

, которая является функцией, которая возвращает выделенную строку достаточно большого размера в *strp, который держит ваш напечатанный строка. Предположим, что ваши WRITE и DEBUG макросы используются только в тех местах, где они используются в качестве заявления, а не внутри выражений, вы могли бы сделать

#define DEBUG(...)    \ 
do {       \ 
    char* strp = 0;    \ 
    asprintf(&strp, __VA_ARG__); \ 
    WRITE(strp);     \ 
    free(strp);     \ 
} while(0) 

Если ваша платформа не имеет asprintf, вы, вероятно, можно придумать реализация которого использует snprintf и расширяет строку, подлежащую возврату по мере необходимости.