Supporto di Visual Studio per i nuovi standard C / C ++?

Continuo a leggere su C99 e C ++ 11 e tutte queste cose totalmente dolci che vengono aggiunte allo standard del linguaggio che potrebbe essere piacevole da usare un giorno. Tuttavia, al momento stiamo languendo nella terra di scrivere C ++ in Visual Studio.

Qualcuno dei nuovi elementi dello standard verrà mai aggiunto allo studio visivo, oppure Microsoft è più interessata ad aggiungere nuove varianti C # per farlo?

Modifica: oltre alla risposta accettata, ho trovato il blog del team di Visual C ++:

http://blogs.msdn.com/vcblog/

E specificamente, questo post in esso:

http://blogs.msdn.com/vcblog/archive/2008/02/22/tr1-slide-decks.aspx

Molto utile. Grazie!

MS ha una serie di risposte pubbliche a questo, la maggior parte di loro incolpare i propri utenti. Come questo:

http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

Ora, il team del compilatore di Visual C ++ riceve occasionalmente domande sul motivo per cui non abbiamo implementato C99. Si basa davvero sull’interesse dei nostri utenti. Dove abbiamo ricevuto molte richieste per determinate funzionalità di C99, abbiamo cercato di implementarle (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 ascoltiamo molto dai nostri utenti C, quindi parla e fatti sentire

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345360

Ciao: sfortunatamente il travolgente follia che otteniamo dalla maggior parte dei nostri utenti è che preferirebbero che ci concentrassimo su C ++ – 0x anziché su C-99. Abbiamo “selezionato con cura” alcune caratteristiche popolari del C-99 (macro variadiche, long long ) ma al di là di questo non è molto probabile fare molto di più nello spazio C-99 (almeno nel breve periodo).

Jonathan Caves

Compilatore di Visual C ++.

Questo è uno stato di cose piuttosto triste, ma ha anche senso se si sospetta che MS voglia bloccare gli utenti: rende molto difficile il porting di codice basato su gcc moderno in MSVC, che almeno trovo estremamente doloroso.

Tuttavia, esiste una soluzione alternativa: si noti che Intel è molto più illuminata su questo. il compilatore Intel C è in grado di gestire il codice C99 e ha persino gli stessi flag di gcc, rendendo molto più facile il porting del codice tra le piattaforms. Inoltre, il compilatore Intel funziona in Visual Studio. Quindi, scartando MS COMPILER puoi ancora usare l’IDE MS che a quanto pare pensi abbia un qualche tipo di valore e usare C99 per i tuoi contenuti di cuori.

Un approccio più ragionevole è quello di passare a Intel CC o gcc e utilizzare Eclipse per il proprio ambiente di programmazione. La portabilità del codice su Windows-Linux-Solaris-AIX-ecc è di solito importante per la mia esperienza e, purtroppo, non è supportata dagli strumenti MS.

Herb Sutter è sia la sedia che un membro molto attivo del comitato di standardizzazione C ++, nonché l’architetto software su Visual Studio per Microsoft.

È tra gli autori del nuovo modello di memoria C ++ standardizzato per C ++ 0x. Ad esempio, i seguenti documenti:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2669.htm
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2197.pdf

avere il suo nome su di esso. Quindi suppongo che l’inclusione su Windows di C ++ 0x sia garantita fino a quando H. Sutter rimane in Microsoft.

Per quanto riguarda C99 solo parzialmente incluso in Visual Studio, immagino che questa sia una questione di priorità.

  • Le funzionalità C99 più interessanti sono già presenti in C ++ (inlining, dichiarazione delle variabili ovunque, // commenti, ecc.) E probabilmente già utilizzabili in C in Visual Studio (se si fa solo il codice C all’interno del compilatore C ++). Vedi la mia risposta qui per una discussione più completa sulle funzionalità di C99 in C ++.
  • C99 aumenta la divergenza tra C e C ++ aggiungendo funzionalità già esistenti in C ++, ma in modo incompatibile (scusate, ma l’implementazione complessa booleana in C99 è ridicola, nel migliore dei casi … Vedi http://david.tribble.com/ text / cdiffs.htm per ulteriori informazioni)
  • La comunità C su Windows sembra inesistente o non abbastanza importante da essere riconosciuta
  • La comunità C ++ su Windows sembra troppo importante per essere ignorata
  • .NET è il modo in cui Microsoft vuole che le persone programmino su Windows. Ciò significa C #, VB.NET, forse C ++ / CLI.

Quindi, sarei Microsoft, perché dovrei implementare funzionalità che poche persone utilizzeranno mai quando le stesse funzionalità sono già state offerte in più lingue attive nella comunità già utilizzate dalla maggior parte delle persone?

Conclusione?

C ++ 0x sarà incluso, come estensione di VS 2008, o sulla prossima generazione (generazioni?) Di Visual Studio.

Le funzionalità del C99 non già implementate non saranno nei prossimi anni, a meno che non accada qualcosa di drammatico (un paese pieno di sviluppatori C99 appare dal nulla?)

Modifica 2011-04-14

Apparentemente, il “paese pieno di sviluppatori C99” esiste già: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Comunque, l’ultimo commento a: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 è abbastanza chiaro, immagino.

Modifica 2012-05-03

Herb Sutter ha chiarito che:

  1. Il nostro objective principale è supportare “la maggior parte di C99 / C11 che è un sottoinsieme di ISO C ++ 98 / C ++ 11”.
  2. Anche per ragioni storiche spediamo un compilatore C90 che accetta (solo) C90 e non C ++
  3. Non prevediamo di supportare le funzionalità ISO C che non fanno parte di C90 o ISO C ++.

Il post del blog aggiunge link e ulteriori spiegazioni per tali decisioni.

Fonte: http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/

A partire dall’anteprima VC2013 1 , C99, è supportato un set più diversificato di C ++ 11 e alcuni standard C ++ 14 recentemente introdotti. Leggi il blog ufficiale per ulteriori dettagli: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Aggiornare:

Da https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej aka: STL è maintainer del team STL @VC):

Nello specifico, nel 2015 è stata completata l’implementazione della libreria standard C99, tranne tgmath.h (irrilevante in C ++) e le macro di pragma CX_LIMITED_RANGE / FP_CONTRACT.

Controlla questo post per i dettagli: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .

Sono stato coinvolto nel lavoro ISO C ++ (2000-2005) e Microsoft ha dato un contributo significativo a quella lingua. Non c’è dubbio che funzioneranno su C ++ 0x, ma avranno bisogno di un po ‘più di tempo rispetto a Intel. Micosoft ha a che fare con un codebase più grande che spesso usa le loro estensioni proprietarie. Questo rende semplicemente un testfase più lungo. Tuttavia, supporteranno la maggior parte di C ++ 0x alla fine (l’esportazione non è ancora amata, o almeno così capisco).

Quando si parla di ISO C, le persone che lavorano su standard non sono rappresentative del mercato di Microsofts. I clienti di Microsofts possono usare C ++ 98 se stanno solo cercando una C. migliore. Perché Microsoft spendere soldi per C99? Certo, parti selezionate da Microsoft, ma è un affare sano. Avrebbero comunque bisogno di quelli per C ++ 0x, quindi perché aspettare?

Il supporto MSVC per C è purtroppo molto carente. Supporta solo la porzione di C99 che è un sottoinsieme di C ++ … il che significa che, ad esempio, è fisicamente imansible compilare ffmpeg o le sue librerie libav * in MSVC, perché usano molte funzionalità C99 come gli elementi struct con nome. Ciò è reso peggiore dal fatto che libavcodec richiede anche un compilatore che mantiene l’allineamento dello stack, che MSVC non ha.

Lavoro su x264, che a differenza di ffmpeg fa uno sforzo per supportare MSVC, anche se farlo spesso è stato un incubo di per sé. Non mantiene l’allineamento dello stack anche se si passa esplicitamente la chiamata della funzione più elevata attraverso una funzione di allineamento dello stack esplicita basata su un assieme, quindi tutte le funzioni che richiedono uno stack allineato devono essere disabilitate. È stato anche molto fastidioso che non potessi usare vararrays; forse questo è il meglio, dal momento che apparentemente GCC li ha massicciamente pessimizzati in termini di prestazioni.

Un post più recente sulla compatibilità delle funzionalità C ++ 11 di MSVC per MSVC 2010 e 2011 è ora online .

Microsoft non ha mai express alcun reale interesse a mantenere la velocità con lo standard C99 (che ormai sta invecchiando). Triste per i programmatori C, ma sospetto che a Microsoft importi di più per la comunità C ++.

Visual C ++ 2008 SP1 contiene almeno parti di TR1 e, di tanto in tanto, il team di Visual C ++ esegue il blogging o parla di C ++ 0x, quindi suppongo che lo supporteranno in qualche momento nella funzionalità. Però non ho letto nulla di ufficiale.

Informazioni aggiornate su questo:

C’è ora (10 Nov 2008) una “Community Tech Preview” (CTP) di VS2010 che contiene un’anteprima di VC10 che ha alcune parti di C ++ 0x implementate (si noti che VC10 non avrà il set completo di C ++ 0x modifiche implementate anche quando VC10 è rilasciato):

http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en

Alcuni dettagli sulle novità del CTP VC10:

  • Rilascio di Visual Studio 2010 CTP
  • Lambdas, auto e static_assert: caratteristiche C ++ 0x in VC10, parte 1

Come notato nell’articolo precedente, “Il compilatore Visual C ++ nel settembre CTP (Community Technology Preview) di Microsoft Visual Studio 2010 contiene il supporto per quattro funzionalità del linguaggio C ++ 0x, vale a dire:”

  • lambda,
  • auto,
  • static_assert,
  • riferimenti di valore

Herb Sutter è il presidente del corpo degli standard ISO C ++ e lavora anche per Microsoft. Non conosco lo standard di Visual Studio C, principalmente perché non uso mai la C normale, ma Microsoft è sicuro di provare a far avanzare il nuovo standard C ++. La prova di questo è – come OregonGhost menzionato – il TR1 che è incluso nell’ultima versione del servizio di Visual Studio.

Il team di Visual C ++ ha pubblicato una tabella di funzionalità C ++ 0x supportate dalla versione 2010 all’indirizzo http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language -features-in-vc10-the-table.aspx . Dal momento che può esserci un ritardo tra le specifiche e l’implementazione, ciò sembra abbastanza ragionevole. Wikipedia ha un bell’articolo sulle specifiche. Non è finito al momento sto scrivendo questo.

Il Visual C ++ Bloq fornisce molte informazioni su diversi punti di interesing riguardanti il ​​supporto di C ++ 11 in VC ++ 11, tra cui diverse tabelle

  • C ++ 11 Caratteristiche del linguaggio principale
  • Caratteristiche del linguaggio di base di C ++ 11: concorrenza
  • C ++ 11 Core Language Features: C99
  • Dimensioni contenitore x86 (byte)
  • Dimensioni contenitore x64 (byte)

Blog del team di Visual C ++, Funzionalità C ++ 11 in Visual C ++ 11