2015-08-14 10 views
7

In cplusplus.com reference for printf vedo una specifica per una formattazione "lunghezza", ma include la nota:C++ Supporto per Specifiers lunghezza

gialle righe indico progettisti e sub-committenti introdotte dal C99. Vedere <cinttypes> per gli specificatori per i tipi estesi.

La mia domanda riguarda specificamente la formattazione della lunghezza hh. Ed è una riga "gialla". La formattazione con hh si comporta come previsto in Visual Studio, ma mi chiedo se sia perché Visual Studio è anche compilatore C o perché hh effettivamente supportato da C++?

+0

[ 'std :: printf'] (http://en.cppreference.com/w/cpp/io/c/fprintf) è completamente supportato e generalmente segue lo standard C. Non che ti raccomando di usarlo, perché ne hai bisogno in C++, dove hai lo std :: cout sicuro dal tipo che non ha bisogno di questi suggerimenti di formattazione? –

+2

Poiché le stringhe del formato printf sono interpretate in fase di runtime, la chiamata non può fallire la compilazione. Naturalmente, molti compilatori tentano di emettere avvisi su stringhe di formato errate e si potrebbe fare riferimento all'assenza di tale avviso. La gestione di hh dipende dall'implementazione della libreria standard. – rici

+0

@rici Questo è un punto eccellente. So che la stringa di formato è interpretata in fase di esecuzione, ma spesso la dimentico. Modificherò la domanda. –

risposta

5

Lo standard C++ ha utilizzato C90 come riferimento normativo fino a C++ 11 e quindi le funzionalità di C99 sarebbero supportate solo in C++ 11. Sebbene un compilatore sarebbe libero di supportarli al di fuori di C++ 11 come estensione. Sospetto che ciò funzioni solo con le versioni più recenti di Visual Studio given their relatively recent drive to support C99 e cremno indicates that it is supported since 2015.

Se andiamo al progetto di sezione standard C++ 11 1.2 Riferimenti normativi [intro.refs] si dice:

I seguenti documenti di riferimento sono indispensabili per l' applicazione di questo documento. Per i riferimenti datati, si applica solo l'edizione citata. Per i riferimenti non datati si applica l'ultima edizione del documento di riferimento (compresi eventuali emendamenti).

e comprende:

  • ISO/IEC 9899: 1999, linguaggi di programmazione - C

e dice anche:

La biblioteca descritto nella Clausola 7 di ISO/IEC 9899: 1999 e clausola 7 di ISO/IEC 9899: 1999/Cor.1: 2001 e Clausola 7 di ISO/IEC 9899: 1999/Cor.2: 2003 è qui di seguito denominata libreria C standard .

prima di C++ 11 questo è stato:

  • ISO/IEC 9899: 1990, Linguaggi di programmazione - C

e se proviamo an example in gcc usando -std=c++03 -pedantic avvisa:

avvertimento: ISO C++ 98 non supporta il gnu_printf lunghezza modificatore 'hh' [-Wformat =]

3

Se si continua a leggere in basso nella pagina

quelli elencati qui sono supportate dalla più recente standard C++ (entrambi pubblicati nel 2011) C e, ma quelli in giallo sono state introdotte in C99 (solo richiesto per C++ implementazioni dal C++ 11)

Quindi, se si dispone di Visual Studio 2013 o successivamente, si avrà accesso al (la maggior parte) C++ 11 caratteristiche.

+0

Ovviamente la risposta sarebbe nascosta nella stessa pagina a cui mi collego. Grazie per aver letto dove ho fallito. –

+2

'hh' in particolare è supportato solo da [2015] (http://blogs.msdn.com/b/vcblog/archive/2014/06/18/crt-features-fixes-and-breaking-changes-in- visual-studio-14-ctp1.aspx). – cremno

+0

@cremno Posso confermare localmente che 'hh' funziona bene per Visual Studio 2010+. –