У меня есть функция отладки, которая принимает формат и переменное число дополнительных аргументов (точно так же как printf()
), преобразует их в форматированную строку, хранящуюся в буфере buf
, и отправляет этот буфер во вторичную функцию, которая на самом деле печатает это:
#include <stdio.h>
#include <stdarg.h>
void debug_printf(const char *fmt, ...)
{
char buf[100];
va_list va;
va_start(va, fmt);
/* Format the string and store it in buf */
vsnprintf(buf, sizeof(buf), fmt, va);
/* Actually print the buf. */
actual_print(buf);
va_end(va);
}
Как я могу изменить эту функцию, чтобы добавить строку к полученному результату? Например, заголовок типа DBG:
, поэтому, если бы я позвонил debug_printf("test1")
, результат вывел бы DBG: test1
.
В качестве альтернативы, как я могу изменить эту функцию, взять переменное целое число (возвращаемое значение функции) и каким-то образом добавить его в виде строки к полученному результату? Например, если бы у меня была функция rng()
, которая возвращала случайное целое число, я мог бы вызвать debug_printf("test2")
, и результат вывел бы что-то вроде 3572 test2
, предполагая, что rng()
вернул целочисленное значение 3572
.
В обоих случаях в идеале решение будет модифицировать тело debug_printf()
, а не заключать его в другую функцию и / или макрос препроцессора.
РЕДАКТИРОВАТЬ : Кажется, я забыл важный момент. Из соображений производительности я бы предпочел звонить только actual_printf()
один раз в течение debug_printf()
. В противном случае да, это было бы довольно простым решением вызвать его дважды: один раз с заголовком и снова с фактической отформатированной строкой. Извините за это!