inttypes
- красная сельдь, вы получаете то же предупреждение от myPrintf("%lld", 1LL);
. Он предупреждает об использовании ll
, который в вашей программе (правильно) доставляется макросом inttypes.
Это похмелье от более старых версий MinGW, где форматирование printf было перенаправлено через MSVCRT, который не обрабатывал %lld
, поэтому было уместно предупредить.
Вы можете решить проблему, добавив новую верхнюю строку в файл (до включения любого стандарта):
#define __USE_MINGW_ANSI_STDIO 1
с последующим использованием следующего атрибута:
__attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2)))
static void myPrintf(const char* fmt, ...)
Это дает указание mingw-w64 использовать собственную реализацию printf, соответствующую стандартам ISO, и соответственно получать предупреждения -Wformat
. Ссылка на документацию
В моей системе (g ++ 8.2.1) использование %lld
и т. Д. На самом деле работает правильно даже без первой строки, поэтому я подозреваю, что они, возможно, починили его для использования ISO stdio вместо MS stdio по умолчанию. Или, возможно, теперь MS stdio знает о %lld
.
Возможно, стоит сообщить об ошибке, чтобы указать, что __attribute__((format(printf
должен автоматически работать должным образом в зависимости от используемого stdio, без необходимости выполнять этот обходной путь.