С помощью макроса с переменным числом:
С помощью макроса с переменным значением можно вызвать функцию с добавленным или добавленным аргументом:
#define t_printf(format, args...) \
_t_printf(format, thread_id, __VA_ARGS__);
Это добавляет thread_id
перед другими аргументами.(Обратите внимание, что в функции _t_printf()
вы также должны изменить строку формата.)
Если вы сделаете это:
t_printf("some format string", a, b, c);
Это развернет, и вы сделаете следующее:
_t_printf("some format string", thread_id, a, b, c);
Если t_printf()
вызывается без другого аргумента в этом формате, у вас будет запятая.GCC имеет расширение ##
, которое обеспечивает добавление запятой по мере необходимости:
#define t_printf(format, args...) \
_t_printf(format, thread_id ##__VA_ARGS__);
Полное решение с помощью макроса:
#define t_printf(format, args...) \
_t_printf(format, thread_id, __VA_ARGS__);
void _t_printf(char * str, ...)
{
if(file_ptr != NULL)
{
char format[1024];
/* safely prefix the format string with [thread_id: %x] */
snprintf(format, sizeof(format), "%s%s", "[thread_id: %x] ", str);
va_list ap;
va_start(ap, str);
vfprintf(file_ptr, format, ap);
va_end(ap);
fflush(file_ptr);
}
}
Без изменения аргументов
Другое решение состоит в том, чтобы выполнить два printf ():
vsnprintf(buffer, bufsize, str, ap);
vfprintf(file_ptr, "[thread_id: %x] %s", thread_id, buffer);
Полное решение:
void _t_printf(char * str, ...)
{
if(file_ptr != NULL)
{
char buffer[1024];
va_list ap;
va_start(ap, str);
vsnprintf(buffer, sizeof(buffer), str, ap);
vfprintf(file_ptr, "[thread_id: %x] %s", thread_id, buffer);
va_end(ap);
fflush(file_ptr);
}
}