2012-03-07 12 views
32

È noto che il compilatore Visual Studio di Microsoft non supporta C99 e sembra che abbiano no plans in support it.Quali funzionalità di C99 sono disponibili nel compilatore MS Visual Studio?

Tuttavia, il compilatore include un po 'di ciliegio caratteristiche come le macro variadic e long long raccolto - vedere le citazioni in this answer:

Dove abbiamo ricevuto molte richieste per determinate funzioni C99, abbiamo cercato di implementarli (o analoghi). Un paio di esempi sono macro variadic, long long, __pragma, __FUNCTION__ e __restrict. Se ci sono altre funzionalità C99 che potresti trovare utili nel tuo lavoro, faccelo sapere! Non si sente molto dai nostri utenti C, in modo da parlare e fare voi stessi sentito

- Arjun Bijanki, rappresentante di Microsoft sul comitato norma ISO C http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

Inoltre, le nuove versioni di Visual Studio sembrano spedire con some of the headers required by C99.

Ci sono molte domande su caratteristiche specifiche, ma quello che non voglio sapere è: Dove posso trovare un elenco delle funzioni C99 supportate/fornite dal compilatore MSVC corrente?

Sto cercando una lista like this one for gcc.

+0

Non ce ne sono. Tutte le funzionalità a cui ti riferisci sono le funzionalità di C++. –

+0

@Jesse: Ho aggiornato la domanda per chiarire che ci sono alcune funzionalità di C99 intenzionalmente supportate nel compilatore di Visual Studio. –

+8

Se si desidera utilizzare C99, perché non usare semplicemente un compilatore che lo supporta? –

risposta

32

Fortunatamente, la posizione di Microsoft su questo problema è cambiata. MSVC++ versione 12.0 (parte di Visual Studio 2013) added support per

  • _Bool tipo.
  • Letterali composti.
  • Iniziatori designati.
  • Miscelazione di dichiarazioni con codice.
  • __func__ identificativo predefinito.

È possibile controllare lo _MSC_VER macro per valori maggiori o uguali a 1800 per vedere se queste funzionalità sono supportate.

Standard library support è stato aggiornato ed è mostly complete in MSVC 14.0 (Visual Studio 2015).

Cose che le versioni precedenti già supportate (credo almeno dal MSVC 7.1/Visual Studio 2003):

  • // commenti in stile.
  • long long tipo.
  • Membri di array flessibili (Microsoft li ha definiti "matrici non protette").
  • Macro variabili (almeno parzialmente).

Le cose che mancano ancora:

  • array di lunghezza variabile (opzionale in C11).
  • Supporto per la parola chiave inline (è possibile utilizzare __inline, ma la semantica potrebbe essere leggermente diversa).
  • Supporto per la parola chiave restrict (potrebbe essere possibile utilizzare __restrict).
  • Funzioni matematiche di tipo generico da tgmath.h.
  • _Complex tipo (opzionale in C11).
+0

Grazie! Non controllo l'overflow dello stack molto spesso, quindi non l'ho visto fino ad ora. Accettato! –

9

Credo che l'unica funzione di linguaggio non libreristico di C99 (che non è in C90) supportata in MSVC sia // commenti. A parte questo, durante la compilazione in modalità C, le uniche funzionalità di C99 che si ottengono sono dovute alle funzionalità della libreria C99 introdotte da Microsoft in quanto tali funzionalità sono state introdotte nello standard C/standard/TR in C++ supportato dal compilatore MS. Ad esempio, hai ottenuto stdint.h in VS 2010 perché era nella bozza di C++ TR1.

Microsoft ha chiarito che non vedono una forte spinta dal mercato per allocare risorse per supportare C99 in MSVC, quindi è quasi certo che le sole parti di C99 che vedrete nella modalità di compilatore C di MSVC sono quelle che ottengono portato a causa di C++.

Una delle cose che I trova frustrante è che le funzionalità di linguaggio C99 non librerie che sono state parte di C++ per un lungo periodo non sono disponibili in modalità C. Personalmente, troverei molto utile se solo la capacità del C99 di mescolare le dichiarazioni con le dichiarazioni fosse supportata durante la compilazione del codice C.

Ma sembra che le funzionalità linguistiche che vedete in C con MSVC oggi è ciò che otterrete da qui in poi.

+0

Grazie, +1. Intendevi che i commenti // sono l'unica funzionalità C99 non libreria ** supportata in Visual Studio **? Sai se le intestazioni di libreria come 'stdint.h' funzionano in modalità C? –

+0

@TimothyJones AFAICT 'stdint.h' funziona per me in modalità C. – ldav1s

+0

"supportato in Visual Studio" - sì. Aggiornerò la domanda per chiarirlo E le poche volte in cui ho utilizzato le intestazioni delle librerie C99 fornite da MSVC in modalità C, hanno funzionato correttamente. –

Problemi correlati