¿Soporte de Visual Studio para los nuevos estándares C / C ++?


102

Sigo leyendo sobre C99 y C ++ 11 y todas estas cosas totalmente dulces que se están agregando al estándar del lenguaje y que podrían ser agradables de usar algún día. Sin embargo, actualmente languidecemos en la tierra de escribir C ++ en Visual Studio.

¿Alguna vez se agregará alguna de las cosas nuevas en el estándar a Visual Studio, o Microsoft está más interesado en agregar nuevas variantes de C # para hacer eso?

Editar: Además de la respuesta aceptada, encontré el blog del equipo de Visual C ++:

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

Y específicamente, esta publicación en ella:

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

Muy útil. ¡Gracias!


3
No entiendo lo útil que encontró en el artículo 2008/02 de vcblog, ya que las características descritas allí han existido durante mucho tiempo en boost y son bastante conocidas. Las características que cambian el mundo de C ++ 0x son diferentes: funciones lambda, inicializadores, etc. enumerados en en.wikipedia.org/wiki/C%2B%2B0x .
amit

Consulte blogs.msdn.com/vcblog/archive/2009/04/22/… artículo reciente también (sé que es más tarde que cuando se hizo la pregunta)
amit

1
Esto se ha mejorado enormemente en versiones recientes de Visual Studio, como 2015 Update 2: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

Considere probar MinGW-64
Basile Starynkevitch

Respuestas:


103

MS tiene una serie de respuestas públicas a esto, la mayoría de ellas culpando a sus usuarios. Como éste:

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

Ahora, el equipo del compilador de Visual C ++ recibe la pregunta ocasional de por qué no hemos implementado C99. Realmente se basa en el interés de nuestros usuarios. Donde hemos recibido muchas solicitudes de ciertas funciones de C99, hemos intentado implementarlas (o análogas). Un par de ejemplos son macros variadic, long long, __pragma, __FUNCTION__, y __restrict. Si hay otras características del C99 que le resulten útiles en su trabajo, ¡háganoslo saber! No escuchamos mucho de nuestros usuarios de C, así que hable y hágase escuchar

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

Hola: desafortunadamente, la respuesta abrumadora que obtenemos de la mayoría de nuestros usuarios es que preferirían que nos enfocamos en C ++ - 0x en lugar de C-99. Hemos seleccionado ciertas características populares del C-99 (macros variadic long long) , pero más allá de esto, es poco probable que hagamos mucho más en el espacio C-99 (al menos en el corto plazo).

Cuevas de Jonathan

Equipo del compilador de Visual C ++.

Este es un estado de cosas bastante triste, pero también tiene sentido si sospecha que MS quiere encerrar a los usuarios: hace que sea muy difícil migrar el código moderno basado en gcc a MSVC, lo que al menos me parece extremadamente doloroso.

Sin embargo, existe una solución alternativa: tenga en cuenta que Intel está mucho más informado sobre esto. el compilador Intel C puede manejar código C99 e incluso tiene los mismos indicadores que gcc, lo que hace que sea mucho más fácil portar código entre plataformas. Además, el compilador de Intel funciona en Visual Studio. Entonces, al eliminar MS COMPILER, aún puede usar el MS IDE que parece pensar que tiene algún tipo de valor, y usar C99 al contenido de su corazón.

Un enfoque más sensato es pasar honestamente a Intel CC o gcc y usar Eclipse para su entorno de programación. La portabilidad del código en Windows-Linux-Solaris-AIX-etc suele ser importante en mi experiencia y, lamentablemente, no es compatible con las herramientas de MS.


42
Aún así, supongo que su verdadera razón es exactamente lo que dijeron: la comunidad C en Windows es quizás casi inexistente, o insignificante en comparación con la comunidad C ++ / C # / .NET / ASP. Por tanto, tienen un punto válido. A pesar de que tengo Linux, y como g ++, no descartaré MSVC ++ solo por C99, lo siento.
paercebal

11
Si al menos nos dieran for (int i ;;) e inline.
Nick Van Brunt


2
La mejor parte de su respuesta sobre el desarrollo orientado a C ++ 0x es que ahora, más de 4 años después, apenas tienen soporte para C ++ 11. (Mientras tanto, gcc admite casi todo el proceso)
GManNickG

10
La vista previa de FWIW, VC2013 ahora es compatible con los estándares C ++ 11 y C99. Vea las novedades para los desarrolladores de C / C ++ .
cuervo vulcan

37

Herb Sutter es presidente y miembro muy activo del comité de estandarización de C ++, así como arquitecto de software en Visual Studio para Microsoft.

Es uno de los autores del nuevo modelo de memoria C ++ estandarizado para C ++ 0x. Por ejemplo, los siguientes artículos:

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

tiene su nombre en él. Así que supongo que la inclusión en Windows de C ++ 0x está asegurada mientras H. Sutter permanezca en Microsoft.

En cuanto a C99 incluido solo parcialmente en Visual Studio, supongo que esto es una cuestión de prioridades.

  • Las características más interesantes de C99 ya están presentes en C ++ (alineación, declaración de variable en cualquier lugar, // comentarios, etc.) y probablemente ya se puedan usar en C en Visual Studio (si solo se hace código C dentro del compilador C ++). Vea mi respuesta aquí para una discusión más completa sobre las características de C99 en C ++.
  • C99 aumenta la divergencia entre C y C ++ al agregar características ya existentes en C ++, pero de una manera incompatible (lo siento, pero la implementación del complejo booleano en C99 es ridícula, en el mejor de los casos ... Ver http://david.tribble.com/ text / cdiffs.htm para obtener más información)
  • La comunidad C en Windows parece inexistente o no es lo suficientemente importante como para ser reconocida
  • La comunidad C ++ en Windows parece demasiado importante para ser ignorada
  • .NET es la forma en que Microsoft quiere que la gente programe en Windows. Esto significa C #, VB.NET, quizás C ++ / CLI.

Entonces, ¿sería Microsoft, por qué implementaría características que pocas personas usarán cuando las mismas características ya se ofrecen en más idiomas activos de la comunidad que ya usa la mayoría de las personas?

¿Conclusión?

Se incluirá C ++ 0x, como extensión de VS 2008, o en la próxima generación (¿generaciones?) De Visual Studio.

Las funciones de C99 que aún no se han implementado no estarán en los próximos años, a menos que suceda algo dramático (¿un país lleno de desarrolladores de C99 aparece de la nada?)

Editar 2011-04-14

Aparentemente, el "país lleno de desarrolladores C99" ya existe: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Aún así, el último comentario en: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 es lo suficientemente claro, supongo.

Editar 2012-05-03

Herb Sutter dejó en claro que:

  1. Nuestro objetivo principal es admitir "la mayor parte de C99 / C11, que es un subconjunto de ISO C ++ 98 / C ++ 11".
  2. También, por razones históricas, enviamos un compilador C90 que acepta (solo) C90 y no C ++
  3. No planeamos admitir características ISO C que no formen parte de C90 o ISO C ++.

La publicación del blog agrega enlaces y más explicaciones para esas decisiones.

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


1
Para ser justos, la implementación booleana en C99 se realizó para permitir la compatibilidad con versiones anteriores con código sano (es decir, código que definía bool para tener booleano).
Maciej Piechotka

19
Esto: "Las características más interesantes de C99 ya están presentes en C ++" es simplemente falso. Formateadores hexadecimales de punto flotante y literales. Funciones de la biblioteca matemática C99. Inicializadores con nombre para estructuras / uniones. La restrictpalabra clave. Hay un montón de excelentes características de C99 que faltan en C ++, y son características que uso todos los días como programador de C.
Stephen Canon

1
@ Stephen Canon: lea mi respuesta en: stackoverflow.com/questions/3879636/… . Por supuesto, esta es una respuesta de C ++ para los desarrolladores de C ++, por lo que no es adecuada para los desarrolladores de C que no estén dispuestos a usar clases, constructores o funciones matemáticas sobrecargadas (¿quién necesita tgmath.h en C ++?). El punto es: lo que importa ya está ahí o es fácil de implementar. En cuanto a la restrictpalabra clave, todavía se puede usar en C ++, aparentemente: stackoverflow.com/questions/776283/… . . .
paercebal

5
@paercebal: tienes derecho a ese punto de vista, pero no hay nada en C ++ que me incite a renunciar a los literales hexadecimales de punto flotante. Este es exactamente mi punto. Por supuesto, a los programadores de C ++ no les importan las características de C99; probablemente por eso son programadores en C ++. Por el contrario, hay todo un mundo de programadores de C a los que no les importan en absoluto las funciones de C ++ y solo quieren que Microsoft proporcione un compilador de C que al menos intente adherirse al estándar como lo hace el resto.
Stephen Canon

13
@paercebal: "equivalentes" son inútiles. Hay millones de líneas de código C portátil que funcionan bien en cualquier otra plataforma. ¿Sugieres que se vuelvan a escribir? La comunidad de usuarios de C99 es lo suficientemente grande como para que todos los demás proveedores importantes de compiladores al menos intenten ofrecer compatibilidad: IBM, HP, Apple, Intel, GNU, Sun, ARM, innumerables compiladores de dispositivos integrados, etc. C99 puede no ser importante para los programadores de Windows , pero los programas de Windows representan una pequeña fracción del código total escrito.
Stephen Canon

11

A partir de la versión preliminar 1 de VC2013 , C99, se admite un conjunto más diversificado de C ++ 11 y algunos estándares C ++ 14 recientemente introducidos. Consulte el blog oficial para obtener más detalles: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Actualizar:

De https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej también conocido como: STL es el mantenedor del equipo de STL @VC):

Específicamente, en 2015 se completó la implementación de nuestra biblioteca estándar C99, excepto tgmath.h (irrelevante en C ++) y las macros pragma CX_LIMITED_RANGE / FP_CONTRACT.

Consulte esta publicación para obtener más detalles: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .


Solo soporte parcial para C99 por lo que puedo decir: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Sabemos que esto no es soporte completo para las funciones de la biblioteca C99".
sdfqwerqaz1

@ sdfqwerqaz1, vea el comentario de STL aquí : "los equipos del compilador y la biblioteca los considerarán caso por caso, pero nuestra principal prioridad es la conformidad con C ++. Por ejemplo, dado que C ++ 11/14 incorpora el estándar C99 Biblioteca por referencia, la Vista previa de 2015 es totalmente compatible con la biblioteca estándar C99 (las únicas omisiones son tgmath.h, que requiere la magia del compilador de C y no es relevante para C ++ que tiene sobrecarga, y CX_LIMITED_RANGE / FP_CONTRACT que también requiere compatibilidad con el compilador) " .
cuervo vulcano

8

Estuve involucrado en el trabajo de ISO C ++ (2000-2005), y Microsoft hizo contribuciones significativas a ese lenguaje. No hay duda de que funcionarán en C ++ 0x, pero necesitarán un poco más de tiempo que Intel. Micosoft tiene que lidiar con una base de código más grande que a menudo usa sus extensiones propietarias. Esto simplemente hace que la prueba sea más larga. Sin embargo, eventualmente admitirán la mayor parte de C ++ 0x (aunque la exportación aún no se ama, o eso tengo entendido).

Cuando se trata de ISO C, las personas que trabajan en el estándar no son representativas del mercado de Microsofts. Los clientes de Microsofts pueden usar C ++ 98 si solo buscan una mejor C. Entonces, ¿por qué Microsoft gastaría dinero en C99? Por supuesto, Microsoft eligió las piezas cuidadosamente, pero eso es un asunto sensato. Los necesitarían para C ++ 0x de todos modos, así que ¿por qué esperar?


7

Lamentablemente, el soporte de MSVC para C es muy deficiente. Solo admite la parte de C99 que es un subconjunto de C ++ ... lo que significa que, por ejemplo, es físicamente imposible compilar ffmpeg o sus bibliotecas libav * en MSVC, porque utilizan muchas características de C99, como elementos de estructura con nombre. Esto se ve agravado por el hecho de que libavcodec también requiere un compilador que mantenga la alineación de la pila, cosa que MSVC no hace.

Trabajo en x264, que a diferencia de ffmpeg hace un esfuerzo para admitir MSVC, aunque hacerlo a menudo ha sido una pesadilla en sí mismo. No mantiene la alineación de la pila incluso si pasa explícitamente la llamada de función más alta a través de una función de alineación de pila explícita basada en ensamblaje, por lo que todas las funciones que requieren una pila alineada deben estar deshabilitadas. También ha sido muy molesto que tampoco pueda usar varrays; quizás esto sea lo mejor, ya que aparentemente GCC los pesimiza enormemente en términos de rendimiento.


6

Una publicación más reciente sobre la compatibilidad de la función C ++ 11 de MSVC para MSVC 2010 y 2011 ya está en línea .


4

Microsoft nunca ha expresado ningún interés real en mantenerse al día con el estándar c99 (que ya está envejeciendo). Triste para los programadores de C, pero sospecho que Microsoft se preocupa más por la comunidad de C ++.


4

Visual C ++ 2008 SP1 contiene partes de TR1 al menos y, de vez en cuando, el equipo de Visual C ++ escribe en blogs o habla sobre C ++ 0x, así que supongo que lo admitirán en algún momento en la función. Aunque no leí nada oficial.


4

Información actualizada sobre esto:

Ahora hay (10 de noviembre de 2008) una "Community Tech Preview" (CTP) de VS2010 que contiene una vista previa de VC10 que tiene algunas partes de C ++ 0x implementadas (tenga en cuenta que VC10 no tendrá el conjunto completo de C ++ 0x cambios implementados incluso cuando se lanza VC10):

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

Algunos detalles sobre las novedades del VC10 CTP:

Como se indica en el artículo anterior, "El compilador de Visual C ++ en la Vista previa de tecnología de la comunidad (CTP) de septiembre de Microsoft Visual Studio 2010 contiene soporte para cuatro características del lenguaje C ++ 0x, a saber:"

  • lambdas,
  • auto,
  • static_assert,
  • referencias de rvalue

3

Herb Sutter es el presidente del organismo de estándares ISO C ++ y también trabaja para Microsoft. No sé sobre el estándar Visual Studio C, principalmente porque nunca uso C simple, pero Microsoft está seguro de intentar impulsar el nuevo estándar C ++. La prueba de esto es, como mencionó OregonGhost, el TR1 que se incluye en la última versión de servicio de Visual Studio.



1

Visual C ++ Bloq proporciona mucha información sobre varios puntos interesantes relacionados con el soporte de C ++ 11 en VC ++ 11, incluidas varias tablas

  • Características del lenguaje principal de C ++ 11
  • Características del lenguaje principal de C ++ 11: concurrencia
  • Características del lenguaje principal de C ++ 11: C99
  • Tamaños de contenedor x86 (bytes)
  • Tamaños de contenedor x64 (bytes)

Blog del equipo de Visual C ++, características de C ++ 11 en Visual C ++ 11

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.