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


102

Continuo a leggere di C99 e C ++ 11 e di tutte queste cose assolutamente dolci che vengono aggiunte allo standard del linguaggio che potrebbe essere bello da usare un giorno. Tuttavia, attualmente languiamo nella terra della scrittura di C ++ in Visual Studio.

Qualcuno dei nuovi elementi dello standard verrà mai aggiunto a Visual Studio o 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 in particolare, questo post in esso:

https://web.archive.org/web/20190109064523/https://blogs.msdn.microsoft.com/vcblog/2008/02/22/tr1-slide-decks/

Molto utile. Grazie!


3
Non capisco cosa hai trovato utile nell'articolo 2008/02 di vcblog poiché le funzionalità descritte esistono da tempo in boost e abbastanza ben note. Le caratteristiche rivoluzionarie di C ++ 0x sono diverse: funzioni lambda, inizializzatori, ecc. Elencati su en.wikipedia.org/wiki/C%2B%2B0x .
amit

Vedi anche blogs.msdn.com/vcblog/archive/2009/04/22/… articolo recente (so che è più tardi rispetto a quando è stata posta la domanda)
amit

1
Questo è stato notevolmente migliorato nelle versioni recenti di Visual Studio, come Aggiornamento 2 2015: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

Considera l'
idea di

Risposte:


103

MS ha una serie di risposte pubbliche a questo, la maggior parte delle quali incolpa i propri utenti. Come questo:

https://devblogs.microsoft.com/cppblog/iso-c-standard-update/

Ora, il team del compilatore di Visual C ++ riceve occasionalmente la domanda sul perché non abbiamo implementato C99. Si basa davvero sull'interesse dei nostri utenti. Dove abbiamo ricevuto molte richieste per alcune funzionalità C99, abbiamo cercato di implementarle (o analoghi). Un paio di esempi sono le macro variadic, long long, __pragma, __FUNCTION__, e __restrict. Se ci sono altre funzionalità del C99 che potresti trovare utili nel tuo lavoro, faccelo sapere! Non sentiamo molto dai nostri utenti C, quindi parlate e fatevi sentire

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

Ciao: sfortunatamente il feadback travolgente che otteniamo dalla maggior parte dei nostri utenti è che preferirebbero che ci concentrassimo su C ++ - 0x invece che su C-99. Abbiamo "selezionato" alcune caratteristiche popolari del C-99 (macro variadiche long long) , ma oltre a questo è improbabile che faremo molto di più nello spazio C-99 (almeno a breve termine).

Jonathan Caves

Team di compilatori di Visual C ++.

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

Tuttavia, esiste una soluzione alternativa: si noti che Intel è molto più illuminata su questo. il compilatore Intel C può gestire il codice C99 e ha anche gli stessi flag di gcc, rendendo molto più semplice il porting del codice tra le piattaforme. Inoltre, il compilatore Intel funziona in visual studio. Quindi, scartando MS COMPILER puoi ancora usare l'IDE MS che sembri pensare abbia un qualche tipo di valore, e usare C99 a tuo piacimento.

Un approccio più sensato è onestamente 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 è solitamente importante nella mia esperienza e, sfortunatamente, non è affatto supportata dagli strumenti MS.


42
Tuttavia, immagino che la loro vera ragione sia esattamente ciò che hanno detto: la comunità C su Windows è forse quasi inesistente, o trascurabile rispetto alla comunità C ++ / C # /. NET / ASP. Quindi, hanno un punto valido. Nonostante abbia Linux e, come g ++, non eliminerò MSVC ++ solo a causa di C99, mi dispiace.
paercebal

11
Se ci dessero almeno per (int i ;;) e inline.
Nick Van Brunt


2
La parte migliore della loro risposta riguardo allo sviluppo orientato al C ++ 0x è che ora, oltre 4 anni dopo, hanno ancora a malapena il supporto per C ++ 11. (Nel frattempo gcc supporta quasi l'intera cosa.)
GManNickG

10
FWIW, l'anteprima di VC2013 ora supporta gli standard C ++ 11 e C99. Scopri le novità per gli sviluppatori C / C ++ .
corvo vulcaniano

37

Herb Sutter è sia il presidente che un membro molto attivo del comitato di standardizzazione C ++, nonché 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

ha il suo nome sopra. Quindi immagino che l'inclusione su Windows di C ++ 0x sia assicurata finché H. Sutter rimane in Microsoft.

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

  • Le funzionalità C99 più interessanti sono già presenti in C ++ (inlining, dichiarazione di variabili ovunque, // commenti, ecc.) E probabilmente già utilizzabili in C in Visual Studio (se si fa solo codice C all'interno del compilatore C ++). Vedi la mia risposta qui per una discussione più completa sulle funzionalità 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 booleana complessa in C99 è ridicola, nella migliore delle ipotesi ... 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, dovrei essere Microsoft, perché dovrei implementare funzionalità che poche persone useranno mai quando le stesse funzionalità sono già offerte in più lingue attive della comunità già utilizzate dalla maggior parte delle persone?

Conclusione?

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

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

Modifica 2011-04-14

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

Tuttavia, l'ultimo commento su: 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 obiettivo principale è supportare "la maggior parte di C99 / C11 che è un sottoinsieme di ISO C ++ 98 / C ++ 11".
  2. Inoltre, per ragioni storiche, forniamo 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 collegamenti e ulteriori spiegazioni per tali decisioni.

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


1
Per essere onesti, l'implementazione booleana in C99 è stata fatta per consentire la retrocompatibilità con il codice sano (cioè il codice che definiva bool come booleano).
Maciej Piechotka

19
Questo: "Le funzionalità C99 più interessanti sono già presenti in C ++" è semplicemente falso. Formattatori e letterali a virgola mobile esadecimale. Funzioni della libreria matematica C99. Inizializzatori con nome per strutture / unioni. La restrictparola chiave. Ci sono un sacco di fantastiche funzionalità C99 che mancano da C ++ e sono funzionalità che uso ogni giorno come programmatore C.
Stephen Canon

1
@Stephen Canon: per favore leggi la mia risposta su: stackoverflow.com/questions/3879636/… . Ovviamente, questa è una risposta C ++ per sviluppatori C ++, quindi non è adatta per sviluppatori C che non vogliono usare classi, costruttori o funzioni matematiche sovraccariche (chi ha bisogno di tgmath.h in C ++?). Il punto è: ciò che conta è già presente o facile da implementare. Per quanto riguarda la restrictparola chiave, puoi ancora usare in C ++, a quanto pare: stackoverflow.com/questions/776283/… . . .
paercebal

5
@paercebal: hai diritto a quel punto di vista, ma non c'è nulla in C ++ che mi induca a rinunciare ai valori letterali in virgola mobile esadecimali. Questo è esattamente il mio punto. Ovviamente ai programmatori C ++ non interessano le funzionalità del C99; questo è probabilmente il motivo per cui sono programmatori C ++. Al contrario, c'è un intero mondo di programmatori C là fuori che non si preoccupano affatto delle funzionalità C ++ e vogliono solo che Microsoft fornisca un compilatore C che almeno cerchi di aderire allo standard come fanno tutti gli altri.
Stephen Canon

13
@paercebal: "equivalenti" sono inutili. Ci sono milioni di righe di codice C portatile che funzionano perfettamente su ogni altra piattaforma. Stai suggerendo di riscriverli? La comunità di utenti C99 è sufficientemente ampia che ogni altro importante fornitore di compilatori tenta almeno di fornire la compatibilità: IBM, HP, Apple, Intel, GNU, Sun, ARM, innumerevoli compilatori di dispositivi embedded, ecc. C99 potrebbe non essere importante per i programmatori Windows , ma i programmi Windows rappresentano una piccola frazione del codice totale scritto.
Stephen Canon

11

A partire dall'anteprima 1 di VC2013 , C99, sono supportati un set più diversificato di C ++ 11 e alcuni standard C ++ 14 di nuova introduzione. Controlla il blog ufficiale per maggiori 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 è il manutentore del team di STL @VC):

In particolare, nel 2015 la nostra implementazione della libreria standard C99 è stata completata, ad eccezione di tgmath.h (irrilevante in C ++) e delle macro 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 .


Supporto solo parziale per C99 per quanto ne so: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Sappiamo che questo non è un supporto completo per le funzioni di libreria C99."
sdfqwerqaz1

@ sdfqwerqaz1, vedere il commento da STL qui : "i team del compilatore e della libreria li considereranno caso per caso, ma la nostra priorità principale è la conformità C ++. Ad esempio, poiché C ++ 11/14 incorpora lo standard C99 Library by reference, 2015 Preview supporta completamente la C99 Standard Library (con le uniche omissioni tgmath.h, che richiede la magia del compilatore C e non è rilevante per C ++ che ha il sovraccarico, e CX_LIMITED_RANGE / FP_CONTRACT che richiedono anche il supporto del compilatore) " .
corvo vulcaniano

8

Sono stato coinvolto nel lavoro ISO C ++ (2000-2005) e Microsoft ha dato un contributo significativo a quel linguaggio. Non c'è dubbio che funzioneranno su C ++ 0x, ma avranno bisogno di un po 'più di tempo rispetto ad Intel. Micosoft ha a che fare con una base di codice più ampia che spesso utilizza le proprie estensioni proprietarie. Questo rende semplicemente un testfase più lungo. Tuttavia, alla fine supporteranno la maggior parte di C ++ 0x (l'esportazione non è ancora amata, o almeno così ho capito).

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


7

Il supporto MSVC per C è purtroppo molto carente. Supporta solo la parte di C99 che è un sottoinsieme di C ++ ... il che significa che, ad esempio, è fisicamente impossibile compilare ffmpeg o le sue librerie libav * in MSVC, perché usano molte caratteristiche C99 come gli elementi struct con nome. Ciò è peggiorato dal fatto che libavcodec richiede anche un compilatore che mantenga l'allineamento dello stack, cosa che MSVC non fa.

Lavoro su x264, che a differenza di ffmpeg fa uno sforzo per supportare MSVC, anche se farlo è stato spesso un incubo in sé e per sé. Non mantiene l'allineamento dello stack anche se si passa esplicitamente la chiamata di funzione più alta attraverso un'esplicita funzione di allineamento dello stack basata su assembly, quindi tutte le funzioni che richiedono uno stack allineato devono essere disabilitate. È stato anche molto fastidioso non poter usare i Vararrays; forse questo è per il meglio, dal momento che apparentemente GCC li pessimizza in maniera massiccia dal punto di vista delle prestazioni.


6

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


4

Microsoft non ha mai espresso alcun reale interesse a tenersi al passo con lo standard c99 (che ormai sta invecchiando). Triste per i programmatori C, ma sospetto che Microsoft si preoccupi di più per la comunità C ++.


4

Visual C ++ 2008 SP1 contiene almeno parti di TR1 e, di tanto in tanto, il team di Visual C ++ blogga o parla di C ++ 0x, quindi immagino che lo supporteranno prima o poi nella funzionalità. Tuttavia non ho letto nulla di ufficiale.


4

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 (nota che VC10 non avrà il set completo di C ++ 0x modifiche implementate anche quando viene rilasciato VC10):

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

Alcuni dettagli sulle novità del CTP VC10:

Come indicato nell'articolo precedente, "Il compilatore Visual C ++ in Microsoft Visual Studio 2010 September Community Technology Preview (CTP) contiene il supporto per quattro funzionalità del linguaggio C ++ 0x, vale a dire:"

  • lambda,
  • auto,
  • static_assert,
  • riferimenti rvalue

3

Herb Sutter è il presidente del corpo degli standard ISO C ++ e lavora anche per Microsoft. Non conosco lo standard C di Visual Studio, principalmente perché non uso mai il C normale, ma Microsoft sta sicuramente cercando di spingere in avanti il ​​nuovo standard C ++. La prova di ciò è, come menzionato da OregonGhost, il TR1 incluso nell'ultima Service Release di Visual Studio.



1

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

  • Funzionalità del linguaggio C ++ 11 Core
  • Funzionalità del linguaggio C ++ 11 Core: concorrenza
  • Funzionalità del linguaggio C ++ 11 Core: C99
  • Dimensioni del contenitore x86 (byte)
  • Dimensioni del contenitore x64 (byte)

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.