Исторически сложилось так, что MinGW был в некоторой степени странной, особенно в том, что касается поддержки C99. MinGW полагается в основном на среду исполнения msvcrt.dll, которая распространяется вместе с Windows, и эта среда выполнения не поддерживает C99.
Таким образом, с более старыми версиями MinGW вы можете столкнуться с проблемами в режиме C99 при использовании спецификаторов формата C99. Также исторически GCC не создавал особых условий для отсутствия поддержки msvcrt.dll спецификаторов C99. Таким образом, вы попадаете в ситуации, когда -Wformat
не будет предупреждать о формате, который бы не работал.
вещи улучшаются с обеих сторон - GCC имеет определенную поддержку -Wformat при использовании с MS выполнения, например:
-Wpedantic-ms-format
так, что GCC не будет сетовать "I32"
и "I64"
(хотя это документирована, я все еще получаю жалобы о том, что будучи непризнанным даже в 4.7.0 - может быть, это совершенно новый)
ms_printf
вариант __attribute__((__format__))
на другая сторона, MinGW предоставила свое собственное snprintf()
некоторое время, так как вариант MSVC, _snprintf()
, ведет себя совершенно по-другому. Тем не менее, MinGW долгое время полагался на printf()
в msvcrt.dll, поэтому спецификаторы формата C99 для printf()
не работали. В какой-то момент MinGW начал предоставлять свою собственную версию printf()
и друзьям, чтобы вы могли получить правильную поддержку C99 (и GNU?). Тем не менее, похоже, что с консервативной стороны они не заменяли версии msvcrt.dll изначально. У них есть имена, такие как __mingw_printf()
.
Похоже, что в некоторый момент между 4.6.1 и 4.7.0 заголовки MinGW начали использовать поставляемые версии MinGW в качестве замены для функции msvcrt.dll (по крайней мере, если вы указали C99).
Однако, похоже, что с более новыми версиями GCC и MinGW все еще немного не синхронизированы. Где, как и раньше, GCC не будет предупреждать о спецификаторах, которые на самом деле не работали бы на MinGW, но не жалуются на то, что это будет делать.
Вы можете попробовать следующий snipet кода, чтобы увидеть, насколько хорошо ваш вариант поддержки MinGW "hhX"
:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
Я не уверен, что предложить, чтобы решить эту проблему вы работаете в - Я думаю, что вы можете исправить заголовок MinGW stdio.h
, чтобы он имел атрибут __attribute__((__format__ (gnu_printf, ...)))
для функций printf (их нет в новее stdio.h
, поэтому GCC будет использовать идею по умолчанию для поддержки формата).
Интересно, что прекрасно работает с GCC 4.3.4: http://ideone.com/LAPP9. Я также пробовал с 4.1.2, и все в порядке. –
Использование MinGW GCC 4.6.1 Я получаю предупреждения как на 'printf()', так и на 'snprintf()' - какой дистрибутив MinGW вы используете? В настоящее время я использую дистрибутив TDM. –
@MichaelBurr: Я даже не понял, что было несколько дистрибутивов MinGW. Я использую «стандартный» вариант, я думаю ([mingw.org] (http://www.mingw.org/), установленный с https://sourceforge.net/projects/mingw/files/Installer/mingw -get-инст /). Значит, это изменит ситуацию? – Socob