Не знаю войдёт ли, сыровато и нормально не сделать без других не вошедших вещей. Смотри по ссылке: по факту compile time checks сработают только если включить некий C-макрос. А иначе вместо них runtime exception, что немного другая история, https://fmt.dev/latest/api.html#c.fmt
гораздо более неприятная (пока не исполнишь нужный код, не узнаешь что там баг). А макрос вот он:
https://github.com …ude/fmt/format.h#L3634
Что же я предлагаю, что макрос либо не нужен (перехерачиваем все исходники и вписываем вместо "%d", например, "%d"_f), либо делаем макрос #define fprintf(...) который аккуратненько ко второму аргументу дописывает то же _f (и надеемся, что никто в классах функции с такими именами не определяет, или руками там переименовываем типы). Но compile time проверка теперь делается _всегда_. Сам же тип, результат конверсии ""_f, он конвертируемый в const char* и обратная совместимость в общем есть.