Вы не можете напрямую передать va_list
в printf
. va_list
- это обертка вокруг фактического списка аргументов (независимо от его представления). Хотя C способ сделать должен использовать vprintf
, в C ++ есть более безопасные альтернативы, такие как шаблоны c variadi, позволяющие создать более безопасную версию форматированной печати, например (строка вымышленного формата для краткости примера):
#include <iostream>
#include <cstdlib>
class ctty {
public:
ctty();
template<typename T, typename... Args>
int logger(int prior, const char* format, T value, Args... args);
private:
void logger(int prior, const char *s);
};
ctty::ctty(){};
void ctty::logger(int prior, const char *s)
{
while (*s) {
if (*s == '%') {
if (*(s + 1) == '%') {
++s;
}
else {
throw std::runtime_error("invalid format string: missing arguments");
}
}
std::cout << *s++;
}
}
template<typename T, typename... Args>
int ctty::logger(int prior, const char* format, T value, Args... args)
{
while (*format) {
if (*format == '%') {
std::cout << value;
logger(prior, format + 1, args...);
return 0;
}
std::cout << *format++;
}
throw std::logic_error("extra arguments provided to logger");
}
int main(int argc, char** argv)
{
ctty tty;
tty.logger(0, "Test % % %\n", 7.55f, "Tada!", 888);
return 0;
}
Эта часть вашего кода:
extern "C" {
#include <stdio.h>
}
Технически это неопределенное поведение, хотя оно может компилироваться и не оказывать неблагоприятного воздействия в некоторых случаях, оно не переносимо. Вы должны использовать заголовки C ++, например <cstdio>