Visual Studio-Unterstützung für neue C / C ++ - Standards?


102

Ich lese immer wieder über C99 und C ++ 11 und all diese total süßen Dinge, die dem Sprachstandard hinzugefügt werden und die eines Tages nützlich sein könnten. Derzeit befinden wir uns jedoch im Land des Schreibens von C ++ in Visual Studio.

Wird eines der neuen Dinge im Standard jemals zu Visual Studio hinzugefügt, oder ist Microsoft mehr daran interessiert, neue C # -Varianten hinzuzufügen, um dies zu tun?

Bearbeiten: Zusätzlich zur akzeptierten Antwort habe ich den Visual C ++ - Teamblog gefunden:

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

Und speziell dieser Beitrag darin:

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

Sehr hilfreich. Vielen Dank!


3
Ich verstehe nicht, welchen Nutzen Sie in dem Artikel 2008/02 von vcblog gefunden haben, da die dort beschriebenen Funktionen seit langem in Boost existieren und recht bekannt sind. Die weltverändernden Funktionen von C ++ 0x sind unterschiedlich: Lambda-Funktionen, Initialisierer usw., aufgeführt unter en.wikipedia.org/wiki/C%2B%2B0x .
Amit

Siehe blogs.msdn.com/vcblog/archive/2009/04/22/… auch den letzten Artikel (ich weiß, dass es später ist, als die Frage gestellt wurde)
amit

1
Dies wurde in neueren Versionen von Visual Studio erheblich verbessert, wie z. B. 2015 Update 2: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

Versuchen Sie es mit MinGW-64
Basile Starynkevitch

Antworten:


103

MS hat eine Reihe öffentlicher Antworten darauf, von denen die meisten ihre Benutzer beschuldigen. Wie dieser:

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

Jetzt erhält das Visual C ++ - Compilerteam gelegentlich die Frage, warum wir C99 nicht implementiert haben. Es basiert wirklich auf dem Interesse unserer Benutzer. Wenn wir viele Anfragen für bestimmte C99-Funktionen erhalten haben, haben wir versucht, diese (oder Analoga) zu implementieren. Ein paar Beispiele sind variadische Makros long long, __pragma, __FUNCTION__, und __restrict. Wenn es andere C99-Funktionen gibt, die Sie für Ihre Arbeit nützlich finden, lassen Sie es uns wissen! Wir hören nicht viel von unseren C-Benutzern, also sprechen Sie und machen Sie sich Gehör

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

Hallo: Leider ist der überwältigende Rückblick, den wir von der Mehrheit unserer Benutzer erhalten, dass sie es vorziehen würden, dass wir uns auf C ++ - 0x anstatt auf C-99 konzentrieren. Wir haben bestimmte beliebte C-99-Funktionen (verschiedene Makros long long) "ausgewählt", aber darüber hinaus ist es unwahrscheinlich, dass wir im C-99-Bereich (zumindest kurzfristig) viel mehr tun.

Jonathan Caves

Visual C ++ Compiler Team.

Dies ist ein ziemlich trauriger Zustand, macht aber auch Sinn, wenn Sie den Verdacht haben, dass MS Benutzer einschließen möchte: Es macht es sehr schwierig, modernen gcc-basierten Code in MSVC zu portieren, was zumindest für mich äußerst schmerzhaft ist.

Es gibt jedoch eine Problemumgehung: Beachten Sie, dass Intel diesbezüglich viel besser informiert ist. Der Intel C-Compiler kann C99-Code verarbeiten und verfügt sogar über dieselben Flags wie gcc, wodurch das Portieren von Code zwischen Plattformen erheblich vereinfacht wird. Der Intel-Compiler arbeitet auch in Visual Studio. Wenn Sie also MS COMPILER verschrotten, können Sie immer noch die MS IDE verwenden, von der Sie glauben, dass sie einen Wert hat, und C99 nach Herzenslust verwenden.

Ein vernünftigerer Ansatz ist es, ehrlich zu Intel CC oder gcc zu wechseln und Eclipse für Ihre Programmierumgebung zu verwenden. Die Portabilität von Code unter Windows-Linux-Solaris-AIX-etc ist meiner Erfahrung nach normalerweise wichtig, und dies wird von MS-Tools leider überhaupt nicht unterstützt.


42
Dennoch denke ich, dass ihr wahrer Grund genau das ist, was sie gesagt haben: Die C-Community unter Windows ist möglicherweise fast nicht vorhanden oder im Vergleich zur C ++ / C # /. NET / ASP-Community vernachlässigbar. Sie haben also einen gültigen Punkt. Obwohl ich ein Linux habe und wie g ++, werde ich MSVC ++ nicht nur wegen C99 verschrotten, sorry.
Paercebal

11
Wenn sie uns wenigstens für (int i ;;) und inline geben würden.
Nick Van Brunt


2
Der beste Teil ihrer Antwort bezüglich der C ++ 0x-orientierten Entwicklung ist, dass sie jetzt, über 4 Jahre später, kaum noch C ++ 11-Unterstützung haben. (In der Zwischenzeit unterstützt gcc fast die gesamte Sache.)
GManNickG

10
Die Vorschau von FWIW, VC2013 unterstützt jetzt die Standards C ++ 11 und C99. Überprüfen Sie, was für C / C ++ - Entwickler neu ist .
Vulkanischer Rabe

37

Herb Sutter ist sowohl Vorsitzender als auch ein sehr aktives Mitglied des C ++ - Standardisierungskomitees sowie Softwarearchitekt in Visual Studio für Microsoft.

Er gehört zu den Autoren des neuen C ++ - Speichermodells, das für C ++ 0x standardisiert ist. Zum Beispiel die folgenden Papiere:

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

habe seinen Namen drauf. Ich denke, die Aufnahme von C ++ 0x unter Windows ist gewährleistet, solange H. Sutter bei Microsoft bleibt.

Da C99 nur teilweise in Visual Studio enthalten ist, ist dies vermutlich eine Frage der Prioritäten.

  • Die interessantesten C99-Funktionen sind bereits in C ++ vorhanden (Inlining, Variablendeklaration überall, // Kommentare usw.) und wahrscheinlich bereits in C in Visual Studio verwendbar (wenn nur C-Code im C ++ - Compiler ausgeführt wird). In meiner Antwort hier finden Sie eine ausführlichere Beschreibung der C99-Funktionen in C ++.
  • C99 erhöht die Divergenz zwischen C und C ++, indem Funktionen hinzugefügt werden, die bereits in C ++ vorhanden sind, jedoch inkompatibel sind (sorry, aber die boolesche komplexe Implementierung in C99 ist bestenfalls lächerlich ... Siehe http://david.tribble.com/). text / cdiffs.htm für weitere Informationen)
  • Die C-Community unter Windows scheint nicht vorhanden oder nicht wichtig genug zu sein, um anerkannt zu werden
  • Die C ++ - Community unter Windows scheint zu wichtig, um ignoriert zu werden
  • Mit .NET möchte Microsoft, dass Benutzer unter Windows programmieren. Dies bedeutet C #, VB.NET, möglicherweise C ++ / CLI.

Wäre ich Microsoft, warum sollte ich Funktionen implementieren, die nur wenige Benutzer jemals verwenden werden, wenn dieselben Funktionen bereits in mehr Community-aktiven Sprachen angeboten werden, die bereits von den meisten Benutzern verwendet werden?

Fazit?

C ++ 0x wird als Erweiterung von VS 2008 oder in der nächsten Generation (Generationen?) Von Visual Studio enthalten sein.

Die nicht bereits implementierten C99-Funktionen werden in den nächsten Jahren nicht verfügbar sein, es sei denn, es passiert etwas Dramatisches (ein Land voller C99-Entwickler erscheint aus dem Nichts?)

Bearbeiten 2011-04-14

Anscheinend existiert das "Land voller C99-Entwickler" bereits: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Der letzte Kommentar unter: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 ist jedoch klar genug.

Bearbeiten 2012-05-03

Herb Sutter machte deutlich, dass:

  1. Unser primäres Ziel ist es, "den größten Teil von C99 / C11 zu unterstützen, das eine Teilmenge von ISO C ++ 98 / C ++ 11 ist".
  2. Wir liefern auch aus historischen Gründen einen C90-Compiler, der (nur) C90 und nicht C ++ akzeptiert
  3. Wir planen nicht, ISO C-Funktionen zu unterstützen, die weder Teil von C90 noch von ISO C ++ sind.

Der Blog-Beitrag fügt Links und weitere Erklärungen für diese Entscheidungen hinzu.

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


1
Um fair zu sein - die boolesche Implementierung in C99 wurde durchgeführt, um die Abwärtskompatibilität mit normalem Code zu ermöglichen (dh Code, der bool als boolesch definiert hat).
Maciej Piechotka

19
Dies: "Die interessantesten C99-Funktionen sind bereits in C ++ vorhanden" ist einfach falsch. Hexadezimale Gleitkomma-Formatierer und Literale. Funktionen der C99-Mathematikbibliothek. Benannte Initialisierer für Strukturen / Gewerkschaften. Das restrictSchlüsselwort. Es gibt eine Menge großartiger C99-Funktionen, die in C ++ fehlen, und diese Funktionen verwende ich jeden Tag als C-Programmierer.
Stephen Canon

1
@ Stephen Canon: Bitte lesen Sie meine Antwort unter: stackoverflow.com/questions/3879636/… . Dies ist natürlich eine C ++ - Antwort für C ++ - Entwickler, daher ist sie nicht für C-Entwickler geeignet, die keine Klassen, Konstruktoren oder überladenen mathematischen Funktionen verwenden möchten (wer benötigt tgmath.h in C ++?). Der Punkt ist: Was zählt, ist bereits vorhanden oder einfach zu implementieren. Das restrictSchlüsselwort können Sie anscheinend weiterhin in C ++ verwenden: stackoverflow.com/questions/776283/… . . .
Paercebal

5
@paercebal: Sie haben Anspruch auf diesen Standpunkt, aber nichts in C ++ würde mich dazu verleiten, hexadezimale Gleitkomma-Literale aufzugeben. Das ist genau mein Punkt. Natürlich interessieren sich C ++ - Programmierer nicht für C99-Funktionen. Das ist wahrscheinlich der Grund, warum sie C ++ - Programmierer sind. Umgekehrt gibt es eine ganze Welt von C-Programmierern, die sich überhaupt nicht für C ++ - Funktionen interessieren und nur möchten, dass Microsoft einen C-Compiler bereitstellt, der zumindest versucht, den Standard einzuhalten, wie es alle anderen tun.
Stephen Canon

13
@paercebal: "Äquivalente" sind nutzlos. Es gibt Millionen von Zeilen tragbaren C-Codes, die auf jeder anderen Plattform einwandfrei funktionieren. Schlagen Sie vor, dass sie neu geschrieben werden? Die C99-Benutzergemeinschaft ist so groß, dass zumindest jeder andere große Compilerhersteller versucht, Kompatibilität bereitzustellen: IBM, HP, Apple, Intel, GNU, Sun, ARM, unzählige Compiler für eingebettete Geräte usw. C99 ist für Windows- Programmierer möglicherweise nicht wichtig . Windows-Programme machen jedoch nur einen winzigen Bruchteil des gesamten geschriebenen Codes aus.
Stephen Canon

11

Ab VC2013 Preview 1 , C99 werden ein breiterer Satz von C ++ 11 und einige neu eingeführte C ++ 14-Standards unterstützt. Weitere Informationen finden Sie im offiziellen Blog: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Aktualisieren:

Von https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej aka: STL ist Betreuer des STL @ VC-Teams):

Insbesondere ist unsere Implementierung der C99-Standardbibliothek im Jahr 2015 abgeschlossen, mit Ausnahme von tgmath.h (in C ++ irrelevant) und den Pragma-Makros CX_LIMITED_RANGE / FP_CONTRACT.

Weitere Informationen finden Sie in diesem Beitrag: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .


Nur teilweise Unterstützung für C99, soweit ich das beurteilen kann: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Wir wissen, dass dies keine vollständige Unterstützung für die Funktionen der C99-Bibliothek ist."
sdfqwerqaz1

@ sdfqwerqaz1, siehe den Kommentar von STL hier : "Die Compiler- und Bibliotheksteams werden sie von Fall zu Fall prüfen, aber unsere Hauptpriorität ist die C ++ - Konformität. Zum Beispiel, da C ++ 11/14 den C99-Standard enthält Library by reference, 2015 Preview unterstützt die C99-Standardbibliothek vollständig (mit den einzigen Auslassungen ist tgmath.h, das C-Compilermagie erfordert und für C ++ mit Überladung nicht relevant ist, und CX_LIMITED_RANGE / FP_CONTRACT, das ebenfalls Compilerunterstützung erfordert) " .
Vulkanischer Rabe

8

Ich war an der ISO C ++ - Arbeit (2000-2005) beteiligt, und Microsoft hat wichtige Beiträge zu dieser Sprache geleistet. Es besteht kein Zweifel, dass sie unter C ++ 0x arbeiten werden, aber sie brauchen etwas mehr Zeit als Intel. Micosoft muss sich mit einer größeren Codebasis auseinandersetzen, die häufig ihre proprietären Erweiterungen verwendet. Dies führt einfach zu einer längeren Testfase. Sie werden jedoch irgendwann den größten Teil von C ++ 0x unterstützen (Export wird jedoch immer noch nicht geliebt, oder so verstehe ich).

Wenn es um ISO C geht, sind die Leute, die an Standards arbeiten, nicht repräsentativ für den Microsoft-Markt. Microsoft-Kunden können C ++ 98 verwenden, wenn sie nur nach einem besseren C suchen. Warum sollte Microsoft also Geld für C99 ausgeben? Sicher, Microsoft hat Teile ausgewählt, aber das ist eine vernünftige Angelegenheit. Sie würden diese sowieso für C ++ 0x brauchen, warum also warten?


7

Die MSVC-Unterstützung für C fehlt leider sehr. Es wird nur der Teil von C99 unterstützt, der eine Teilmenge von C ++ ist. Dies bedeutet, dass es beispielsweise physikalisch unmöglich ist, ffmpeg oder seine libav * -Bibliotheken in MSVC zu kompilieren, da sie viele C99-Funktionen wie benannte Strukturelemente verwenden. Dies wird durch die Tatsache verschlimmert, dass libavcodec auch einen Compiler benötigt, der die Stapelausrichtung beibehält, was MSVC nicht tut.

Ich arbeite an x264, die im Gegensatz zu ffmpeg nicht anstrengen zu MSVC zu unterstützen, obwohl so oft einen Alptraum an und für sich gewesen zu tun. Die Stapelausrichtung wird nicht beibehalten, selbst wenn Sie den höchsten Funktionsaufruf explizit über eine explizite Assembly-basierte Stapelausrichtungsfunktion übergeben. Daher müssen alle Funktionen, die einen ausgerichteten Stapel erfordern, deaktiviert werden. Es war auch sehr ärgerlich, dass ich auch keine Vararrays verwenden kann; Vielleicht ist dies das Beste, da GCC sie anscheinend in Bezug auf die Leistung massiv pessimiert.



4

Microsoft hat nie wirklich Interesse daran bekundet, mit dem c99-Standard (der mittlerweile in die Jahre gekommen ist) auf dem Laufenden zu bleiben. Traurig für C-Programmierer, aber ich vermute, dass Microsoft sich mehr für die C ++ - Community interessiert.


4

Visual C ++ 2008 SP1 enthält mindestens Teile von TR1, und von Zeit zu Zeit bloggt oder spricht das Visual C ++ - Team über C ++ 0x. Ich denke, sie werden es irgendwann in der Funktion unterstützen. Ich habe allerdings nichts offizielles gelesen.


4

Aktualisierte Informationen hierzu:

Es gibt jetzt (10. November 2008) eine "Community Tech Preview" (CTP) von VS2010, die eine Vorschau von VC10 enthält, in der einige Teile von C ++ 0x implementiert sind (beachten Sie, dass VC10 nicht den vollständigen Satz von C ++ 0x enthält Änderungen auch bei Freigabe von VC10 implementiert):

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

Einige Details zu den Neuerungen im VC10 CTP:

Wie im obigen Artikel erwähnt, enthält der Visual C ++ - Compiler in der Community Technology Preview (CTP) von Microsoft Visual Studio 2010 im September Unterstützung für vier C ++ 0x-Sprachfunktionen, nämlich: "

  • Lambdas,
  • Auto,
  • static_assert,
  • rWertreferenzen

3

Herb Sutter ist Vorsitzender des ISO C ++ - Normungsgremiums und arbeitet auch für Microsoft. Ich weiß nichts über den Visual Studio C-Standard - hauptsächlich, weil ich nie einfaches C verwende -, aber Microsoft ist sicher, dass es versucht, den neuen C ++ - Standard voranzutreiben. Ein Beweis dafür ist - wie bereits von OregonGhost erwähnt - der TR1, der in der neuesten Visual Studio Service-Version enthalten ist.



1

Das Visual C ++ Bloq bietet viele Informationen zu verschiedenen interessanten Punkten in Bezug auf die Unterstützung von C ++ 11 in VC ++ 11, einschließlich mehrerer Tabellen

  • C ++ 11-Kernsprachenfunktionen
  • C ++ 11-Kernsprachenfunktionen: Parallelität
  • C ++ 11-Kernsprachenfunktionen: C99
  • x86-Containergrößen (Bytes)
  • x64-Containergrößen (Bytes)

Visual C ++ Team Blog, C ++ 11 Funktionen in Visual C ++ 11

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.