Storicamente, MinGW è stato in una situazione un po 'strana, specialmente per quanto riguarda il supporto C99. MinGW si basa principalmente sul runtime msvcrt.dll distribuito con Windows e che runtime non supporta C99.
Quindi con le versioni precedenti di MinGW, è possibile incorrere in problemi in modalità C99 quando si utilizzano specificatori di formato specifici per C99. Inoltre, storicamente, GCC non ha apportato adattamenti speciali alla mancanza di supporto di msvcrt.dll per gli specificatori C99. Quindi ti trovavi in situazioni in cui -Wformat
non avvisava di un formato che non avrebbe funzionato.
Le cose stanno migliorando su entrambi i lati - GCC ha il supporto specifico per -Wformat quando viene utilizzato con il runtime MS, come ad esempio:
-Wpedantic-ms-format
in modo che GCC non lamentarsi "I32"
e "I64"
(anche se è documentato, ho ancora una denuncia sul fatto che sia riconosciuto anche in 4.7.0 - forse è nuovo di zecca)
- l'opzione
ms_printf
al __attribute__((__format__))
Sul Dall'altra parte, MinGW ha fornito il proprio snprintf()
per un po ', poiché la variante di MSVC, _snprintf()
, si comporta in modo molto diverso. Tuttavia, MinGW si affidava a lungo allo printf()
in msvcrt.dll, quindi gli specificatori di formato C99 per printf()
non funzionavano. A un certo punto, MinGW ha iniziato a fornire la propria versione di printf()
e gli amici in modo da ottenere il supporto C99 (e GNU?) Corretto. Tuttavia, sembra che dal lato conservatore, questi non hanno sostituito inizialmente le versioni di msvcrt.dll. Hanno nomi come __mingw_printf()
.
Sembra che ad un certo punto tra 4.6.1 e 4.7.0, le intestazioni MinGW inizino a utilizzare le versioni fornite da MinGW come sostituti della funzione msvcrt.dll (almeno se è stato specificato C99).
Tuttavia, sembra che con le versioni più recenti, GCC e MinGW siano ancora un po 'fuori sincrono. Dove prima GCC non avrebbe avvertito gli specificatori che non avrebbero funzionato su MinGW, non si lamenta degli spcifiers che lo faranno.
si consiglia di provare il seguente snipet di codice per vedere come la versione di sostegno MinGW "hhX"
:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
Non sono sicuro di cosa suggerire per risolvere il problema si sta eseguendo in - Penso che potresti essere in grado di patchare l'intestazione MinGW stdio.h
in modo che abbia un attributo __attribute__((__format__ (gnu_printf, ...)))
sulle funzioni printf (non ci sono nel nuovo stdio.h
, quindi GCC userà l'idea predefinita di quale sia il supporto del formato).
interessante, funziona benissimo con GCC 4.3.4: http://ideone.com/LAPP9. Ho anche provato con 4.1.2, e va bene anche su quello. –
Uso di GG MinGW 4.6.1 Ricevo avvisi sia su 'printf()' che su 'snprintf()' - quale distro MinGW stai usando? Attualmente sto usando la distribuzione TDM. –
@ Michael Burr: Uh, non mi ero nemmeno reso conto che c'erano diverse distribuzioni MinGW. Sto usando quello "standard", immagino ([mingw.org] (http://www.mingw.org/), installato con https://sourceforge.net/projects/mingw/files/Installer/mingw -get-inst /). Questo farebbe la differenza, però? – Socob