Вы также заметите, что в документах по Visual Studio написано:
Примечание. Префиксы h и l являются расширениями Microsoft при использовании с данными типа char.
Я думаю, что было бы точнее сказать "при использовании со спецификаторами формата 'c'
или 's'
(верхний или нижний регистр)".
Поймите, что компилятор GCC действительно не знает о том, как среда выполнения Microsoft работает со строками формата printf()
, и предупреждение, которое выдает GCC, адаптировано к средам выполнения, которые он более обычно использует. При сборке с MinGW используется среда выполнения Microsoft C, предоставляемая с Windows, msvcrt.dll
(хотя MinGW предоставляет замены или обертки для некоторых библиотечных функций). Поэтому иногда возникает путаница между тем, что компилятор считает приемлемым для строки формата printf()
, и аргументами, предоставленными printf()
, и тем, что на самом деле будет делать среда выполнения.
Например, до недавнего времени использование ll
для целочисленного преобразования для форматирования 64-битного типа int не работало правильно в MinGW. Я не уверен, исправлено ли это в функциях поддержки MinGW или msvcrt.dll
было обновлено для поддержки модификатора ll
(подозреваю, что msvcrt.dll
было обновлено - мне придется проверить .. .). * * тысяча двадцать-один
В любом случае, все сводится к тому, что независимо от предупреждений, которые GCC выдает о строке формата printf()
, по всей вероятности, вам нужно будет использовать документы MSVC для строк формата, поскольку среда выполнения MS это MinGW буду использовать. Если вам не нравится генерируемый warngin, вы можете рассмотреть возможность добавления опции -Wno-format
в ваш скрипт сборки MinGW.