Поддержка Visual Studio новых стандартов C / C ++?


102

Я продолжаю читать о C99 и C ++ 11 и обо всех этих совершенно приятных вещах, которые добавляются к языковому стандарту и которые когда-нибудь могут быть полезны. Однако в настоящее время мы томимся в стране написания C ++ в Visual Studio.

Будет ли когда-либо добавлено что-либо из нового стандарта в Visual Studio, или Microsoft больше заинтересована в добавлении для этого новых вариантов C #?

Изменить: в дополнение к принятому ответу я нашел блог команды Visual C ++:

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

И конкретно этот пост в нем:

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

Очень полезно. Спасибо!


3
Я не понимаю, что вы нашли полезного в статье из vcblog за 2008/02 год, поскольку описанные там функции давно существуют в ускоренном режиме и довольно хорошо известны. Изменяющие мир функции C ++ 0x отличаются: лямбда-функции, инициализаторы и т. Д., Перечисленные на en.wikipedia.org/wiki/C%2B%2B0x .
amit

См. Также недавнюю статью blogs.msdn.com/vcblog/archive/2009/04/22/… (я знаю, что это позже, чем когда был задан вопрос)
amit

1
Это было значительно улучшено в последних версиях Visual Studio, таких как Обновление 2 2015 года: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Рикардо Перес,

Подумайте о том, чтобы попробовать MinGW-64
Базилий Старынкевич

Ответы:


103

У MS есть серия публичных ответов на это, большинство из которых обвиняют своих пользователей. Как этот:

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

Теперь команда компилятора Visual C ++ иногда получает вопрос, почему мы не реализовали C99. Это действительно основано на интересе наших пользователей. Там, где мы получали много запросов на определенные функции C99, мы пытались реализовать их (или аналоги). Пара примеров являются VARIADIC макросов long long, __pragma, __FUNCTION__, и __restrict. Если есть другие функции C99, которые могут вам пригодиться в работе, сообщите нам об этом! Мы мало слышим от наших пользователей C, так что говорите и пусть вас услышат

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

Привет: к сожалению, подавляющее мнение, которое мы получаем от большинства наших пользователей, заключается в том, что они предпочли бы, чтобы мы сосредоточились на C ++ - 0x, а не на C-99. У нас есть «тщательно отобранные» некоторые популярные функции C-99 (вариативные макросы long long), но помимо этого мы вряд ли сделаем что-то еще в области C-99 (по крайней мере, в краткосрочной перспективе).

Джонатан Кейвс

Команда разработчиков Visual C ++.

Это довольно печальное положение дел, но оно также имеет смысл, если вы подозреваете, что MS хочет заблокировать пользователей: из-за этого очень сложно переносить современный код на основе gcc в MSVC, что, по крайней мере, я считаю чрезвычайно болезненным.

Однако существует обходной путь: обратите внимание, что Intel гораздо более осведомлена об этом. компилятор Intel C может обрабатывать код C99 и даже имеет те же флаги, что и gcc, что значительно упрощает перенос кода между платформами. Также компилятор Intel работает в visual studio. Так что, отказавшись от MS COMPILER, вы все равно можете использовать MS IDE, которая, по вашему мнению, имеет какую-то ценность, и использовать C99 в свое удовольствие.

Честно говоря, более разумный подход - перейти на Intel CC или gcc и использовать Eclipse в своей среде программирования. По моему опыту, переносимость кода в Windows-Linux-Solaris-AIX и т. Д. Обычно важна, и, к сожалению, это совсем не поддерживается инструментами MS.


42
Тем не менее, я полагаю, что их истинная причина именно в том, что они сказали: сообщество C в Windows, возможно, почти отсутствует или незначительно по сравнению с сообществом C ++ / C # /. NET / ASP. Таким образом, у них есть веская точка зрения. Несмотря на то, что у меня есть Linux и, как и g ++, я не откажусь от MSVC ++ только из-за C99, извините.
paercebal

11
Если бы они дали нам хотя бы for (int i ;;) и inline.
Ник Ван Брант,


2
Лучшая часть их ответа относительно разработки, ориентированной на C ++ 0x, заключается в том, что сейчас, более 4 лет спустя, они все еще почти не поддерживают C ++ 11. (Между тем gcc поддерживает почти все.)
GManNickG

10
Предварительная версия FWIW, VC2013 теперь поддерживает стандарты C ++ 11 и C99. Узнайте, что нового для разработчиков C / C ++ .
vulcan raven

37

Херб Саттер является председателем и активным членом комитета по стандартизации C ++, а также архитектором программного обеспечения Visual Studio for Microsoft.

Он является одним из авторов новой модели памяти C ++, стандартизированной для C ++ 0x. Например, следующие документы:

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

иметь его имя на нем. Так что, я полагаю, включение C ++ 0x в Windows гарантировано, пока Х. Саттер остается в Microsoft.

Что же касается C99, включенного в Visual Studio лишь частично, я думаю, это вопрос приоритетов.

  • Наиболее интересные функции C99 уже присутствуют в C ++ (встраивание, объявление переменных в любом месте, // комментарии и т. Д.) И, вероятно, уже могут использоваться в C в Visual Studio (если только код C выполняется в компиляторе C ++). См. Мой ответ здесь для более полного обсуждения функций C99 в C ++.
  • C99 увеличивает расхождение между C и C ++, добавляя функции, уже существующие в C ++, но несовместимым образом (извините, но сложная логическая реализация в C99 в лучшем случае смехотворна ... См. Http://david.tribble.com/ text / cdiffs.htm для получения дополнительной информации)
  • Сообщество C в Windows кажется несуществующим или недостаточно важным, чтобы его признавать
  • Сообщество C ++ в Windows кажется слишком важным, чтобы его игнорировать
  • .NET - это способ, которым Microsoft хочет, чтобы люди программировали в Windows. Это означает C #, VB.NET, возможно, C ++ / CLI.

Итак, если бы я был Microsoft, зачем мне реализовывать функции, которые немногие люди когда-либо будут использовать, когда те же функции уже предлагаются на более активных языках сообщества, которые уже используются большинством людей?

Вывод?

C ++ 0x будет включен как расширение VS 2008 или в следующее поколение (поколения?) Visual Studio.

Функции C99, которые еще не реализованы, не появятся в ближайшие годы, если не произойдет чего-то драматического (страна, полная разработчиков C99, появится из ниоткуда?)

Изменить 2011-04-14

Судя по всему, «страна, полная разработчиков C99» уже существует: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Тем не менее, последний комментарий на: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 , я думаю, достаточно ясен.

Изменить 2012-05-03

Херб Саттер пояснил, что:

  1. Наша основная цель - поддерживать «большую часть C99 / C11, которая является подмножеством ISO C ++ 98 / C ++ 11».
  2. Мы также по историческим причинам поставляем компилятор C90, который принимает (только) C90, а не C ++.
  3. Мы не планируем поддерживать функции ISO C, которые не являются частью C90 или ISO C ++.

Сообщение в блоге добавляет ссылки и дальнейшие объяснения этих решений.

Источник: http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/


1
Чтобы быть справедливым - логическая реализация в C99 была сделана для обеспечения обратной совместимости с нормальным кодом (то есть кодом, который определил, что bool имеет логическое значение).
Maciej Piechotka

19
Это: «Самые интересные функции C99 уже присутствуют в C ++» - это просто ложь. Шестнадцатеричные средства форматирования с плавающей запятой и литералы. Функции математической библиотеки C99. Именованные инициализаторы для структур / объединений. restrictКлючевое слово. В C ++ отсутствует масса замечательных функций C99, и это функции, которые я использую каждый день как программист на C.
Стивен Кэнон

1
@ Стефен Канон: Прочтите мой ответ по адресу: stackoverflow.com/questions/3879636/… . Конечно, это ответ C ++ для разработчиков C ++, поэтому он не подходит для разработчиков C, не желающих использовать классы, конструкторы или перегруженные математические функции (кому нужен tgmath.h в C ++?). Суть в том, что то, что важно, уже есть или легко реализовать. Что касается restrictключевого слова, вы все еще можете использовать в C ++, по-видимому: stackoverflow.com/questions/776283/… . . .
paercebal

5
@paercebal: вы имеете право на эту точку зрения, но в C ++ нет ничего, что могло бы побудить меня отказаться от шестнадцатеричных литералов с плавающей запятой. Это как раз моя точка зрения. Конечно, программисты на C ++ не заботятся о возможностях C99; наверное, поэтому они программисты на C ++. И наоборот, существует целый мир программистов на C, которые совершенно не заботятся о функциях C ++ и просто хотят, чтобы Microsoft предоставила компилятор C, который хотя бы пытается придерживаться стандарта, как и все остальные.
Стивен Кэнон

13
@paercebal: «эквиваленты» бесполезны. Существуют миллионы строк переносимого кода C, которые отлично работают на любой другой платформе. Вы предлагаете их переписать? Сообщество пользователей C99 достаточно велико, чтобы любой другой крупный поставщик компиляторов хотя бы пытался обеспечить совместимость: IBM, HP, Apple, Intel, GNU, Sun, ARM, бесчисленные компиляторы встроенных устройств и т. Д. C99 может не иметь значения для программистов Windows , но программы Windows составляют крошечную долю всего написанного кода.
Стивен Кэнон

11

Начиная с VC2013 preview 1 , поддерживаются C99, более разнообразный набор C ++ 11 и некоторые недавно представленные стандарты C ++ 14. Посетите официальный блог для получения дополнительных сведений: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Обновить:

Из https://news.ycombinator.com/item?id=9434483 (Стефан Т. Лававей, он же: STL поддерживает команду STL @VC):

В частности, в 2015 году реализация нашей стандартной библиотеки C99 завершена, за исключением tgmath.h (не имеющего отношения к C ++) и макросов прагмы CX_LIMITED_RANGE / FP_CONTRACT.

Подробнее читайте в этом сообщении: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .


Насколько я могу судить, только частичная поддержка C99: blogs.msdn.com/b/vcblog/archive/2013/07/19/… «... Мы знаем, что это не полная поддержка функций библиотеки C99».
sdfqwerqaz1

@ sdfqwerqaz1, см. комментарий от STL здесь : «Команды компиляторов и библиотек будут рассматривать их в индивидуальном порядке, но наш главный приоритет - соответствие C ++. Например, поскольку C ++ 11/14 включает стандарт C99 Библиотека по ссылке, предварительная версия 2015 полностью поддерживает стандартную библиотеку C99 (за исключением tgmath.h, который требует магии компилятора C и не имеет отношения к C ++, который имеет перегрузку, и CX_LIMITED_RANGE / FP_CONTRACT, который также требует поддержки компилятора) " .
vulcan raven

8

Я принимал участие в работе над ISO C ++ (2000–2005), и Microsoft внесла значительный вклад в этот язык. Нет сомнений, что они будут работать на C ++ 0x, но им потребуется немного больше времени, чем, скажем, Intel. Micosoft приходится иметь дело с более крупной кодовой базой, которая часто использует их собственные расширения. Это просто увеличивает длину тестовой базы. Тем не менее, в конечном итоге они будут поддерживать большую часть C ++ 0x (хотя экспорт все еще не нравится, по крайней мере, я так понимаю).

Когда дело доходит до ISO C, люди, работающие над стандартом, не являются представителями рынка Microsoft. Клиенты Microsoft могут использовать C ++ 98, если они просто ищут лучший C. Так зачем Microsoft тратить деньги на C99? Конечно, детали, отобранные Microsoft, но это нормальный бизнес. Они все равно понадобятся для C ++ 0x, так зачем ждать?


7

К сожалению, поддержки MSVC для C очень не хватает. Он поддерживает только ту часть C99, которая является подмножеством C ++ ... что означает, например, что физически невозможно скомпилировать ffmpeg или его библиотеки libav * в MSVC, поскольку они используют многие функции C99, такие как именованные элементы структуры. Это усугубляется тем фактом, что libavcodec также требует компилятора, который поддерживает выравнивание стека, чего нет в MSVC.

Я работаю над x264, который, в отличие от ffmpeg , прилагает усилия для поддержки MSVC, хотя это часто само по себе было кошмаром. Он не поддерживает выравнивание стека, даже если вы явно передаете вызов функции наивысшего уровня через явную функцию выравнивания стека на основе сборки, поэтому все функции, требующие выравнивания стека, должны быть отключены. Также очень раздражало то, что я тоже не могу использовать vararrays; возможно, это к лучшему, поскольку, очевидно, GCC сильно пессимизирует их с точки зрения производительности.



4

Microsoft никогда не проявляла реального интереса к поддержанию скорости со стандартом c99 (который к настоящему времени устарел). Печально для C-программистов, но я подозреваю, что Microsoft больше заботится о C ++ - сообществе.


4

Visual C ++ 2008 SP1 содержит, по крайней мере, части TR1, и время от времени команда Visual C ++ ведет блог или обсуждает C ++ 0x, поэтому я думаю, что они будут поддерживать его в какой-то момент в этой функции. Но ничего официального я не читал.


4

Обновленная информация по этому поводу:

В настоящее время (10 ноября 2008 г.) существует "Community Tech Preview" (CTP) VS2010, который содержит предварительную версию VC10, в которой реализованы некоторые части C ++ 0x (обратите внимание, что VC10 не будет иметь полного набора C ++ 0x изменения реализованы даже после выпуска VC10):

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

Некоторые подробности о том, что нового в VC10 CTP:

Как отмечалось в статье выше, «Компилятор Visual C ++ в сентябрьской версии Microsoft Visual Studio 2010 Community Technology Preview (CTP) содержит поддержку четырех языковых функций C ++ 0x, а именно:»

  • лямбды,
  • авто,
  • static_assert,
  • ссылки rvalue

3

Херб Саттер является председателем комитета стандартов ISO C ++, а также работает в Microsoft. Я не знаю о стандарте Visual Studio C - в основном потому, что я никогда не использую простой C, - но Microsoft уверена, что пытается продвигать новый стандарт C ++ вперед. Свидетельством этого является - как упоминалось в OregonGhost - TR1, включенный в последний выпуск Visual Studio Service Release.


3

Команда Visual C ++ опубликовала таблицу функций C ++ 0x, которые поддерживает выпуск 2010, по адресу http://blogs.msdn.com/b/vcblog/archive/2010/04/06/c-0x-core-language. -features-в-vc10-the-table.aspx . Поскольку между спецификацией и реализацией может быть запаздывание, это кажется вполне разумным. В Википедии есть хорошая статья о спецификации. На момент написания статьи это еще не закончено.


1

Visual C ++ Bloq предоставляет много информации о нескольких интересных моментах, касающихся поддержки C ++ 11 в VC ++ 11, включая несколько таблиц.

  • Возможности базового языка C ++ 11
  • Возможности базового языка C ++ 11: параллелизм
  • Основные возможности языка C ++ 11: C99
  • Размеры контейнера x86 (байты)
  • Размеры контейнера x64 (байты)

Блог группы разработчиков Visual C ++, Возможности C ++ 11 в Visual C ++ 11

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.