Obsługa programu Visual Studio dla nowych standardów C / C ++?

102

Ciągle czytam o C99 i C ++ 11 i wszystkich tych całkowicie słodkich rzeczach, które są dodawane do standardu językowego, który może być kiedyś przyjemny w użyciu. Jednak obecnie gnijemy w krainie pisania C ++ w Visual Studio.

Czy którykolwiek z nowych elementów standardu zostanie kiedykolwiek dodany do Visual Studio, czy też Microsoft jest bardziej zainteresowany dodaniem nowych wariantów C # w tym celu?

Edycja: Oprócz zaakceptowanej odpowiedzi znalazłem blog zespołu Visual C ++:

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

A konkretnie ten post w nim:

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

Bardzo przydatne. Dzięki!

Colen
źródło
3
Nie rozumiem, co znalazłeś w artykule 2008/02 z vcbloga, ponieważ opisane tam funkcje od dawna istnieją w boosterze i są dość dobrze znane. Zmieniające świat funkcje C ++ 0x są różne: funkcje lambda, inicjatory itp. Wymienione na en.wikipedia.org/wiki/C%2B%2B0x .
amit
Zobacz blogs.msdn.com/vcblog/archive/2009/04/22/ ... także ostatni artykuł (wiem, że jest później niż wtedy, gdy zadawano pytanie)
pozdrawiam
1
Zostało to znacznie ulepszone w ostatnich wersjach programu Visual Studio, takich jak 2015 Update 2: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres
Rozważ wypróbowanie MinGW-64
Basile Starynkevitch

Odpowiedzi:

103

MS ma na to szereg publicznych odpowiedzi, z których większość obwinia swoich użytkowników. Jak ten:

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

Teraz zespół kompilatora Visual C ++ otrzymuje od czasu do czasu pytanie, dlaczego nie zaimplementowaliśmy C99. To naprawdę opiera się na zainteresowaniu naszych użytkowników. Tam, gdzie otrzymaliśmy wiele próśb o pewne funkcje C99, próbowaliśmy je wdrożyć (lub analogi). A kilka przykładów są o zmiennej liczbie argumentów makra long long, __pragma, __FUNCTION__, i __restrict. Jeśli istnieją inne funkcje C99, które mogą Ci się przydać w pracy, daj nam znać! Nie słyszymy zbyt wiele od naszych użytkowników C, więc mów głośno i daj się usłyszeć

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

Cześć: niestety przytłaczający feadback, jaki otrzymujemy od większości naszych użytkowników, polega na tym, że woleliby, abyśmy skupili się na C ++ - 0x zamiast na C-99. Wybraliśmy kilka popularnych funkcji C-99 (makra wariadyczne long long), ale poza tym jest mało prawdopodobne, abyśmy zrobili więcej w przestrzeni C-99 (przynajmniej w krótkim okresie).

Jonathan Caves

Zespół kompilatora Visual C ++.

Jest to dość smutny stan rzeczy, ale ma również sens, jeśli podejrzewasz, że MS chce zablokować użytkowników: bardzo utrudnia przeniesienie nowoczesnego kodu opartego na gcc do MSVC, co przynajmniej uważam za niezwykle bolesne.

Istnieje jednak obejście: Zauważ, że firma Intel jest o wiele bardziej świadoma w tej kwestii. kompilator Intel C może obsługiwać kod C99, a nawet ma te same flagi co gcc, co znacznie ułatwia przenoszenie kodu między platformami. Kompilator Intela działa również w Visual Studio. Porzucając MS COMPILER, nadal możesz używać MS IDE, które wydaje ci się mieć jakąś wartość, i używać C99 do zadowolenia.

Bardziej rozsądnym podejściem jest uczciwe przejście na Intel CC lub gcc i użycie Eclipse w swoim środowisku programistycznym. Z mojego doświadczenia wynika, że ​​przenośność kodu w systemach Windows-Linux-Solaris-AIX-etc jest zwykle ważna, a niestety nie jest to wcale obsługiwane przez narzędzia MS.

jakobengblom2
źródło
42
Mimo to wydaje mi się, że ich prawdziwy powód jest dokładnie taki, jak powiedzieli: społeczność C w systemie Windows prawdopodobnie prawie nie istnieje lub jest znikoma w porównaniu ze społecznością C ++ / C # / .NET / ASP. Dlatego mają ważny punkt. Mimo że mam Linuksa i podobnie jak g ++, nie wyrzucę MSVC ++ tylko z powodu C99, przepraszam.
paercebal
11
Gdyby przynajmniej dali nam for (int i ;;) i inline.
Nick Van Brunt,
2
Najlepszą częścią ich odpowiedzi dotyczącej programowania zorientowanego na C ++ 0x jest to, że teraz, ponad 4 lata później, nadal mają one prawie żadne wsparcie dla C ++ 11. (Tymczasem gcc obsługuje prawie całą rzecz.)
GManNickG,
10
FWIW, wersja zapoznawcza VC2013 obsługuje teraz standardy C ++ 11 i C99. Sprawdź, co nowego dla programistów C / C ++ .
Vulcan Raven
37

Herb Sutter jest przewodniczącym i bardzo aktywnym członkiem komitetu normalizacyjnego C ++, a także architektem oprogramowania w Visual Studio for Microsoft.

Jest jednym z autorów nowego modelu pamięci C ++ znormalizowanego dla C ++ 0x. Na przykład następujące dokumenty:

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

mieć na nim jego nazwisko. Wydaje mi się, że włączenie C ++ 0x w systemie Windows jest zapewnione, o ile H. Sutter pozostaje w firmie Microsoft.

Jeśli chodzi o C99 tylko częściowo zawarty w Visual Studio, myślę, że jest to kwestia priorytetów.

  • Najciekawsze funkcje C99 są już obecne w C ++ (wstawianie, deklarowanie zmiennych w dowolnym miejscu, // komentarze itp.) I prawdopodobnie już można je używać w C w programie Visual Studio (jeśli tylko wykonujemy kod C w kompilatorze C ++). Zobacz moją odpowiedź tutaj, aby uzyskać bardziej szczegółową dyskusję na temat funkcji C99 w C ++.
  • C99 zwiększa rozbieżność między C i C ++, dodając funkcje już istniejące w C ++, ale w niekompatybilny sposób (przepraszam, ale skomplikowana implementacja logiczna w C99 jest śmieszna, w najlepszym razie ... Zobacz http://david.tribble.com/ text / cdiffs.htm, aby uzyskać więcej informacji)
  • Wydaje się, że społeczność C w systemie Windows nie istnieje lub nie jest na tyle ważna, aby ją docenić
  • Społeczność C ++ w systemie Windows wydaje się zbyt ważna, aby ją ignorować
  • .NET to sposób, w jaki Microsoft chce, aby ludzie programowali w systemie Windows. Oznacza to C #, VB.NET, być może C ++ / CLI.

Czy byłbym więc firmą Microsoft, dlaczego miałbym wdrażać funkcje, których niewielu ludzi kiedykolwiek używa, skoro te same funkcje są już oferowane w bardziej aktywnych dla społeczności językach, które są już używane przez większość ludzi?

Wniosek?

C ++ 0x zostanie dołączony jako rozszerzenie VS 2008 lub następnej generacji (generacji?) Visual Studio.

Funkcje C99, które nie zostały jeszcze zaimplementowane, nie będą dostępne w kolejnych latach, chyba że wydarzy się coś dramatycznego (kraj pełen programistów C99 pojawia się znikąd?)

Edytuj 2011-04-14

Najwyraźniej „kraj pełen programistów C99” już istnieje: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Mimo to ostatni komentarz pod adresem : http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 jest, jak sądzę, wystarczająco jasny.

Edytuj 2012-05-03

Herb Sutter wyjaśnił, że:

  1. Naszym głównym celem jest obsługa „większości C99 / C11, czyli podzbioru ISO C ++ 98 / C ++ 11”.
  2. Również ze względów historycznych dostarczamy kompilator C90, który akceptuje (tylko) C90, a nie C ++
  3. Nie planujemy obsługi funkcji ISO C, które nie są częścią C90 ani ISO C ++.

Wpis na blogu zawiera linki i dalsze wyjaśnienia dotyczące tych decyzji.

Źródło: http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/

paercebal
źródło
1
Aby być uczciwym - implementacja logiczna w C99 została wykonana, aby umożliwić wsteczną zgodność z rozsądnym kodem (tj. Kod, który zdefiniował wartość bool jako wartość logiczną).
Maciej Piechotka
19
To: „Najbardziej interesujące funkcje C99 są już obecne w C ++” jest po prostu fałszem. Szesnastkowe zmiennoprzecinkowe elementy formatujące i literały. Funkcje biblioteki matematycznej C99. Nazwane inicjatory struktur / unions. Słowo restrictkluczowe. Jest mnóstwo wspaniałych funkcji C99, których brakuje w C ++ i są to funkcje, których używam na co dzień jako programista C.
Stephen Canon,
1
@Stephen Canon: Przeczytaj moją odpowiedź na: stackoverflow.com/questions/3879636/… . Oczywiście jest to odpowiedź C ++ dla programistów C ++, więc nie jest odpowiednia dla programistów C, którzy nie chcą używać klas, konstruktorów lub przeciążonych funkcji matematycznych (kto potrzebuje tgmath.h w C ++?). Chodzi o to, że to, co się liczy, już istnieje lub jest łatwe do wdrożenia. Jeśli chodzi o restrictsłowo kluczowe, nadal możesz go używać w C ++, najwyraźniej: stackoverflow.com/questions/776283/… . . .
paercebal,
5
@paercebal: masz prawo do tego punktu widzenia, ale w C ++ nie ma nic, co mogłoby mnie zachęcić do rezygnacji z szesnastkowych literałów zmiennoprzecinkowych. To jest dokładnie mój punkt widzenia. Oczywiście programiści C ++ nie przejmują się funkcjami C99; prawdopodobnie dlatego są programistami C ++. I odwrotnie, istnieje cały świat programistów C, którzy w ogóle nie przejmują się funkcjami C ++ i po prostu chcą, aby Microsoft dostarczył kompilator C, który przynajmniej stara się przestrzegać standardu, tak jak robią to wszyscy inni.
Stephen Canon
13
@paercebal: „odpowiedniki” są bezużyteczne. Istnieją miliony linii przenośnego kodu C, które działają dobrze na każdej innej platformie. Sugerujesz, aby zostały przepisane? Społeczność użytkowników C99 jest na tyle duża, że każdy inny główny producent kompilatorów przynajmniej próbuje zapewnić kompatybilność: IBM, HP, Apple, Intel, GNU, Sun, ARM, niezliczone kompilatory urządzeń wbudowanych itp. C99 może nie być ważne dla programistów Windows , ale programy Windows stanowią niewielki ułamek całego napisanego kodu.
Stephen Canon
11

Począwszy od wersji zapoznawczej VC2013 1 , C99, obsługiwany jest bardziej zróżnicowany zestaw C ++ 11 i niektóre nowo wprowadzone standardy C ++ 14. Sprawdź oficjalny blog, aby uzyskać więcej informacji: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Aktualizacja:

Z https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej aka: STL jest opiekunem zespołu STL @VC):

W szczególności w 2015 roku nasza implementacja biblioteki standardowej C99 została zakończona, z wyjątkiem makr tgmath.h (nieistotne w C ++) i CX_LIMITED_RANGE / FP_CONTRACT pragma makra.

Sprawdź ten post, aby uzyskać szczegółowe informacje: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .

wulkaniczny kruk
źródło
O ile wiem, tylko częściowe wsparcie dla C99: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Wiemy, że nie jest to pełna obsługa funkcji biblioteki C99."
sdfqwerqaz1
@ sdfqwerqaz1, zobacz komentarz STL tutaj : „zespoły kompilatorów i bibliotek rozpatrzą je indywidualnie dla każdego przypadku, ale naszym głównym priorytetem jest zgodność z C ++. Na przykład, ponieważ C ++ 11/14 zawiera standard C99 Biblioteka przez odniesienie, wersja zapoznawcza 2015 w pełni obsługuje bibliotekę standardową C99 (z jedynymi pominięciami to tgmath.h, który wymaga magii kompilatora C i nie jest odpowiedni dla C ++, który ma przeciążenie, oraz CX_LIMITED_RANGE / FP_CONTRACT, które również wymagają obsługi kompilatora) ” .
Vulcan Raven
8

Brałem udział w pracach nad ISO C ++ (2000-2005), a Microsoft wniósł znaczący wkład w ten język. Nie ma wątpliwości, że będą działać na C ++ 0x, ale będą potrzebować trochę więcej czasu niż mówią Intel. Micosoft musi radzić sobie z większą bazą kodów, która często korzysta z ich zastrzeżonych rozszerzeń. To po prostu powoduje dłuższą fazę testową. Jednak ostatecznie będą obsługiwać większość C ++ 0x (eksport nadal nie jest lubiany, przynajmniej tak rozumiem).

Jeśli chodzi o ISO C, ludzie pracujący nad normą nie są reprezentatywni dla rynku Microsoftów. Klienci Microsoftu mogą używać C ++ 98, jeśli szukają tylko lepszego C. Dlaczego więc Microsoft miałby wydawać pieniądze na C99? Jasne, wybrane przez Microsoft części, ale to rozsądny biznes. I tak potrzebowaliby ich do C ++ 0x, więc po co czekać?

MSalters
źródło
7

Niestety, brakuje obsługi MSVC dla C. Obsługuje tylko część C99, która jest podzbiorem C ++ ... co oznacza, że ​​na przykład fizycznie niemożliwe jest skompilowanie ffmpeg lub jego bibliotek libav * w MSVC, ponieważ używają one wielu funkcji C99, takich jak nazwane elementy struktury. Sytuację pogarsza fakt, że libavcodec wymaga również kompilatora, który utrzymuje wyrównanie stosu, czego MSVC tego nie robi.

Pracuję na x264, który w przeciwieństwie do ffmpeg jest dołożyć starań, aby wspierać MSVC, ale robi tak często był koszmar w sobie. Nie utrzymuje wyrównania stosu, nawet jeśli jawnie przekażesz najwyższe wywołanie funkcji przez jawną funkcję wyrównania stosu opartą na zestawie, więc wszystkie funkcje, które wymagają wyrównanego stosu, muszą być wyłączone. Bardzo denerwujące było również to, że nie mogę używać vararrayów; być może tak jest najlepiej, ponieważ najwyraźniej GCC masowo pesymuje je pod względem wydajności.

Dark Shikari
źródło
6

Nowszy post dotyczący zgodności funkcji MSVC C ++ 11 z MSVC 2010 i 2011 jest już dostępny online .

fbrereto
źródło
4

Microsoft nigdy nie wyraził żadnego prawdziwego zainteresowania dotrzymaniem kroku standardowi c99 (który się starzeje). Smutne dla programistów C, ale podejrzewam, że Microsoft bardziej dba o społeczność C ++.

JesperE
źródło
4

Visual C ++ 2008 SP1 zawiera przynajmniej części TR1, a od czasu do czasu zespół Visual C ++ pisze na blogu lub mówi o C ++ 0x, więc myślę, że będą go kiedyś wspierać w tej funkcji. Nie przeczytałem jednak niczego oficjalnego.

OregonGhost
źródło
4

Zaktualizowane informacje na ten temat:

Obecnie (10 listopada 2008 r.) Istnieje „Community Tech Preview” (CTP) VS2010, która zawiera podgląd VC10 z zaimplementowanymi pewnymi częściami C ++ 0x (zauważ, że VC10 nie będzie miał pełnego zestawu C ++ 0x zmiany wprowadzone nawet po wydaniu VC10):

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

Kilka szczegółów na temat nowości w VC10 CTP:

Jak wspomniano w powyższym artykule, „Kompilator Visual C ++ w programie Microsoft Visual Studio 2010 Community Technology Preview (CTP) z września obsługuje cztery funkcje języka C ++ 0x, a mianowicie:”

  • lambdy,
  • automatyczny,
  • static_assert,
  • odniesienia do wartości r
Michael Burr
źródło
3

Herb Sutter jest przewodniczącym organizacji zajmującej się normami ISO C ++ i pracuje również dla firmy Microsoft. Nie wiem o standardzie Visual Studio C - głównie dlatego, że nigdy nie używam zwykłego C - ale Microsoft z pewnością stara się popchnąć nowy standard C ++ do przodu. Dowodem na to jest - jak wspomniano OregonGhost - TR1, który jest zawarty w najnowszej wersji usługi Visual Studio.

QBziZ
źródło
1

Visual C ++ Bloq zawiera wiele informacji na temat kilku interesujących punktów dotyczących obsługi C ++ 11 w VC ++ 11, w tym kilka tabel

  • Podstawowe funkcje języka C ++ 11
  • Podstawowe funkcje języka C ++ 11: Współbieżność
  • Podstawowe funkcje języka C ++ 11: C99
  • Rozmiary kontenerów x86 (w bajtach)
  • Rozmiary kontenerów x64 (w bajtach)

Blog zespołu Visual C ++, C ++ 11 Funkcje w Visual C ++ 11

Pixelchemist
źródło