2013-03-25 17 views
28

Voglio stampare il valore di una variabile size_t utilizzando printf in C++ utilizzando Microsoft Visual Studio 2010 (voglio usare printf invece di << in questo specifico pezzo di codice, quindi per favore risposte a dirmi che dovrebbero usare << invece) .Specificatore di formato printf corretto per size_t:% zu o% Iu?

Secondo il post

Platform independent size_t Format specifiers in c?

il corretto modo indipendente dalla piattaforma è quello di utilizzare %zu, ma questo non sembra funzionare in Visual Studio. La documentazione di Visual Studio a

http://msdn.microsoft.com/en-us/library/vstudio/tcxf1dw6.aspx

mi dice che devo usare %Iu (utilizzando lettere maiuscole i, non minuscolo l).

Microsoft non sta seguendo gli standard qui? O è stato cambiato lo standard dal C99? O è lo standard diverso tra C e C++ (che sembrerebbe molto strano per me)?

+6

La pagina di MSDN ti sei collegato a: I prefissi per la modifica della lunghezza I, I32 e I64 sono estensioni Microsoft e non sono ANSI-compatibili, il che sembra rispondere alla tua domanda sulla MS in base agli standard. –

+3

http://stackoverflow.com/questions/1546789/clean-code-to-printf-size-t-in-c-or-nearest-equivalent-of-c99s-z-in-c – Nima

risposta

3

Giusto per mettere in chiaro e ripetere ciò che è stato detto nei commenti. MS Visual Studio non supportava lo specificatore printf %zu prima del VS2013. A partire da VS2013 (ad esempio _MSC_VER> = 1800) è finalmente disponibile lo %zu.

In alternativa, per le versioni precedenti di Visual Studio, se si sta stampando piccoli valori (come il numero di elementi contenitori std) si può semplicemente lanciare ad un int e utilizzare% d:

printf("count: %d\n", (int)str.size()); // less digital ink spent 
// or: 
printf("count: %u\n", (unsigned)str.size()); 
+0

Se si sta prendendo di mira C++, vorrei usare static_cast in preferenza a un cast in stile C. Ha il vantaggio principale di essere controllato in fase di compilazione. – Tanaya

14

Il compilatore C di Microsoft non raggiunge gli standard C più recenti. È fondamentalmente un compilatore C89 con alcune caratteristiche selezionate da C99 (ad esempio long long). Quindi, non dovrebbe sorprendere che qualcosa non sia supportato (%zu è apparso in C99).

4

In base alla risposta da here, %z è un'aggiunta C99. Poiché MSVC non supporta nessuno degli ultimi standard C, non sorprende che lo %z non sia supportato.

+0

Da qualche parte (non lo faccio sfortunatamente abbiamo il riferimento) MS ha detto che non * mai * supporteranno C99. – john

+2

@john: vedere ad es. http: // herbsutter.com/2012/05/03/lettore-qa-what-about-VC-e-C99 /. Il loro compilatore si chiama Visual C++, dalla versione 1.0, e in contrasto con il loro compilatore "Microsoft C/C++" di DOS. – MSalters

+2

VS 2015 supporta C99. Sia il supporto del 2013 che del 2015 '% zu'. –

15

Da The microsoft documentation

HH, j, z, e prefissi t lunghezza non sono supportati.

Essa afferma che il prefisso corretto da utilizzare per size_t è I - quindi devi usare %Iu

+7

VS 2015 supporta ''% z'' –

Problemi correlati