#include #include #include #include [[gnu::format(printf, 1, 2)]] auto format(const char * fmt, ...) -> std::string { va_list args1; va_start(args1, fmt); va_list args2; va_copy(args2, args1); std::vector buf(1 + std::vsnprintf(nullptr, 0, fmt, args1)); va_end(args1); std::vsnprintf(buf.data(), buf.size(), fmt, args2); va_end(args2); return buf.data(); } int main() { int i = 123; // warning: format specifies type 'double' but the argument has type 'int' [-Wformat] auto str = format("%f\n", i); // ~~ ^ // %d std::cout << str; }