Historycznie MinGW był w nieco dziwnej sytuacji, szczególnie jeśli chodzi o wsparcie dla C99. MinGW opiera się głównie na środowisku wykonawczym msvcrt.dll, które jest rozprowadzane w systemie Windows, i że środowisko wykonawcze nie obsługuje C99.
Tak więc w starszych wersjach MinGW można napotkać problemy w trybie C99 podczas korzystania ze specyfikatorów formatu C99. Również historycznie, GCC nie robi żadnych specjalnych noclegów dla msvcrt.dll na brak wsparcia dla specyfikatorów C99. A więc dostaniesz się do sytuacji, w których -Wformat
nie ostrzegłby o formacie, który nie działał.
Rzeczy poprawy po obu stronach - GCC ma szczególne wsparcie -Wformat gdy używany ze środowiskiem wykonawczym MS, takich jak:
-Wpedantic-ms-format
tak, że GCC nie będzie narzekać "I32"
i "I64"
(nawet jeśli jest to udokumentowane, wciąż otrzymuję skargi o to czy jest nierozpoznane nawet w 4.7.0 - może to nowiutki)
- opcja
ms_printf
do __attribute__((__format__))
na z drugiej strony, MinGW przez jakiś czas udostępniał swój własny snprintf()
, ponieważ wariant MSVC, _snprintf()
, zachowuje się zupełnie inaczej. Jednak MinGW przez długi czas polegał na printf()
w msvcrt.dll, więc specyfikatory formatu C99 dla printf()
nie działały. W pewnym momencie MinGW zaczął dostarczać własną wersję printf()
i znajomych, aby uzyskać właściwą obsługę C99 (i GNU?). Wydaje się jednak, że po stronie konserwatywnej nie zastąpiły one początkowo wersji msvcrt.dll. Mają nazwy takie jak __mingw_printf()
.
Wygląda na to, że w pewnym momencie między 4.6.1 a 4.7.0 nagłówki MinGW zaczęły używać dostarczonych wersji MinGW jako zamienniki dla funkcji msvcrt.dll (przynajmniej jeśli podałeś C99).
Wygląda jednak na to, że w nowszych wersjach GCC i MinGW wciąż nie są zsynchronizowane. Gdzie tak jak wcześniej GCC nie ostrzegałby o specyfikacjach, które nie działałyby na MinGW, nie narzekałby na to, że spiskowy to zrobi.
Możesz wypróbować następujące snipet kodu, aby zobaczyć, jak dobrze wersję MinGW wsparcia "hhX"
:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
Nie jestem pewien, co sugeruje, aby rozwiązać problem używasz do - Myślę, że możesz być w stanie załączyć nagłówek MinGW stdio.h
tak, aby miał atrybut __attribute__((__format__ (gnu_printf, ...)))
dla funkcji printf (nie ma ich w nowszym stdio.h
, więc GCC użyje domyślnego pomysłu na obsługę formatów).
Co ciekawe, to działa dobrze z GCC 4.3.4: http://ideone.com/LAPP9. Próbowałem również z 4.1.2, i to też w porządku. –
Używanie MinGW GCC 4.6.1 Otrzymuję ostrzeżenia zarówno na 'printf()' jak i 'snprintf()' - jakiej używacie dystrybucji MinGW? Obecnie używam dystrybucji TDM. –
@MichaelBurr: Uh, nawet nie zdawałem sobie sprawy, że istnieje kilka dystrybucji MinGW. Używam "standardowego", jak sądzę ([mingw.org] (http://www.mingw.org/), zainstalowanego z https://sourceforge.net/projects/mingw/files/Installer/mingw -get-inst /). Czy to jednak miało znaczenie? – Socob