Suporte do Visual Studio para novos padrões C / C ++?


102

Eu continuo lendo sobre C99 e C ++ 11 e todas essas coisas totalmente legais que estão sendo adicionadas ao padrão de linguagem que podem ser úteis um dia. No entanto, atualmente definhamos na terra de escrever C ++ no Visual Studio.

Alguma das coisas novas no padrão será adicionada ao Visual Studio ou a Microsoft está mais interessada em adicionar novas variantes do C # para fazer isso?

Editar: além da resposta aceita, encontrei o blog da equipe do Visual C ++:

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

E, especificamente, esta postagem nele:

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

Muito útil. Obrigado!


3
Não entendo o que você achou útil no artigo de 2008/02 do vcblog, já que os recursos descritos lá existem há muito tempo e são bastante conhecidos. Os recursos que mudam o mundo do C ++ 0x são diferentes: funções lambda, inicializadores, etc. listados em en.wikipedia.org/wiki/C%2B%2B0x .
Amit

Veja blogs.msdn.com/vcblog/archive/2009/04/22/… artigo recente também (eu sei que é mais tarde do que quando a pergunta foi feita)
amit

1
Isso foi muito melhorado nas versões recentes do Visual Studio, como a Atualização 2 de 2015: visualstudio.com/en-us/news/vs2015-update2-vs.aspx#Cdoubleplus
Ricardo Peres

Considere tentar MinGW-64
Basile Starynkevitch

Respostas:


103

A MS tem uma série de respostas públicas a isso, a maioria delas culpando seus usuários. Como este:

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

Agora, a equipe do compilador Visual C ++ recebe ocasionalmente a pergunta sobre por que não implementamos C99. É realmente baseado no interesse de nossos usuários. Onde recebemos muitas solicitações para determinados recursos do C99, tentamos implementá-los (ou análogos). Alguns exemplos são macros variádicos, long long, __pragma, __FUNCTION__, e __restrict. Se houver outros recursos do C99 que você achará úteis em seu trabalho, avise-nos! Não ouvimos muito de nossos usuários C, então fale e faça-se ouvir

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

Olá: infelizmente, a resposta esmagadora que recebemos da maioria dos nossos usuários é que eles preferem que nos concentremos em C ++ - 0x em vez de C-99. Nós selecionamos certas características populares do C-99 (macros variadas long long) , mas, além disso, é improvável que façamos muito mais no espaço do C-99 (pelo menos no curto prazo).

Jonathan Caves

Equipe do Compilador Visual C ++.

Este é um estado de coisas muito triste, mas também faz sentido se você suspeita que o MS deseja bloquear os usuários: torna muito difícil portar códigos modernos baseados em gcc para o MSVC, o que pelo menos eu acho extremamente doloroso.

No entanto, existe uma solução alternativa: Observe que a Intel é muito mais esclarecida sobre isso. o compilador Intel C pode lidar com o código C99 e até tem os mesmos sinalizadores do gcc, tornando muito mais fácil portar o código entre as plataformas. Além disso, o compilador Intel funciona em estúdio visual. Então, descartando o MS COMPILER, você ainda pode usar o MS IDE que você parece achar que tem algum tipo de valor, e usar o C99 para o seu conteúdo.

Uma abordagem mais sensata é, honestamente, mudar para Intel CC ou gcc e usar o Eclipse para seu ambiente de programação. Portabilidade de código através do Windows-Linux-Solaris-AIX-etc geralmente é importante na minha experiência, e isso não é de todo suportado pelas ferramentas MS, infelizmente.


42
Ainda assim, acho que a verdadeira razão é exatamente o que eles disseram: a comunidade C no Windows talvez seja quase inexistente ou insignificante quando comparada à comunidade C ++ / C # /. NET / ASP. Portanto, eles têm um ponto válido. Apesar de eu ter um Linux, e como o g ++, não vou descartar o MSVC ++ só por causa do C99, desculpe.
paercebal

11
Se eles nos dessem pelo menos para (int i ;;) e inline.
Nick Van Brunt


2
A melhor parte de sua resposta sobre o desenvolvimento orientado a C ++ 0x é que agora, mais de 4 anos depois, eles ainda quase não têm suporte a C ++ 11. (Enquanto isso, o gcc suporta quase tudo.)
GManNickG

10
FWIW, a visualização VC2013 agora oferece suporte aos padrões C ++ 11 e C99. Confira o que há de novo para desenvolvedores C / C ++ .
vulcan raven

37

Herb Sutter é o presidente e um membro muito ativo do comitê de padronização C ++, bem como arquiteto de software no Visual Studio for Microsoft.

Ele está entre os autores do novo modelo de memória C ++ padronizado para C ++ 0x. Por exemplo, os seguintes papéis:

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

tem seu nome nele. Portanto, acho que a inclusão de C ++ 0x no Windows está garantida enquanto H. Sutter permanecer na Microsoft.

Quanto ao C99 apenas parcialmente incluído no Visual Studio, acho que é uma questão de prioridades.

  • Os recursos mais interessantes do C99 já estão presentes no C ++ (inlining, declaração de variável em qualquer lugar, // comentários, etc.) e provavelmente já podem ser usados ​​em C no Visual Studio (se apenas estiver fazendo código C no compilador C ++). Veja minha resposta aqui para uma discussão mais completa sobre os recursos do C99 em C ++.
  • C99 aumenta a divergência entre C e C ++ ao adicionar recursos já existentes em C ++, mas de forma incompatível (desculpe, mas a implementação do complexo booleano em C99 é risível, na melhor das hipóteses ... Veja http://david.tribble.com/ text / cdiffs.htm para mais informações)
  • A comunidade C no Windows parece inexistente ou não é importante o suficiente para ser reconhecida
  • A comunidade C ++ no Windows parece muito importante para ser ignorada
  • .NET é a forma como a Microsoft deseja que as pessoas programem no Windows. Isso significa C #, VB.NET, talvez C ++ / CLI.

Então, eu seria a Microsoft, por que implementaria recursos que poucas pessoas usarão quando os mesmos recursos já são oferecidos em mais idiomas ativos da comunidade já usados ​​pela maioria das pessoas?

Conclusão?

C ++ 0x será incluído, como extensão do VS 2008, ou na próxima geração (gerações?) Do Visual Studio.

Os recursos do C99 ainda não implementados não estarão nos próximos anos, a menos que algo dramático aconteça (um país cheio de desenvolvedores do C99 aparece do nada?)

Editar 14/04/2011

Aparentemente, o "país cheio de desenvolvedores C99" já existe: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6415401
^ _ ^

Ainda assim, o último comentário em: http://blogs.msdn.com/vcblog/archive/2007/11/05/iso-c-standard-update.aspx#6828778 é claro o suficiente, eu acho.

Editar 03/05/2012

Herb Sutter deixou claro que:

  1. Nosso objetivo principal é oferecer suporte à "maior parte do C99 / C11 que é um subconjunto do ISO C ++ 98 / C ++ 11".
  2. Também, por razões históricas, enviamos um compilador C90 que aceita (apenas) C90 e não C ++
  3. Não planejamos oferecer suporte a recursos ISO C que não façam parte do C90 ou do ISO C ++.

A postagem do blog adiciona links e mais explicações para essas decisões.

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


1
Para ser justo - a implementação booleana em C99 foi feita para permitir a compatibilidade com versões anteriores com código lógico (ou seja, código que definiu bool como booleano).
Maciej Piechotka

19
Isto: "Os recursos mais interessantes do C99 já estão presentes no C ++" é simplesmente falso. Formatadores e literais de ponto flutuante hexadecimal. Funções de biblioteca matemática C99. Inicializadores nomeados para structs / uniões. A restrictpalavra-chave. Existem muitos recursos excelentes do C99 que estão faltando no C ++ e são recursos que eu uso todos os dias como programador de C.
Stephen Canon

1
@Stephen Canon: Leia minha resposta em: stackoverflow.com/questions/3879636/… . Obviamente, esta é uma resposta C ++ para desenvolvedores C ++, portanto, não é adequada para desenvolvedores C que não desejam usar classes, construtores ou funções matemáticas sobrecarregadas (quem precisa de tgmath.h em C ++?). A questão é: o que importa já está lá ou é fácil de implementar. Quanto à restrictpalavra - chave, você ainda pode usar em C ++, aparentemente: stackoverflow.com/questions/776283/… . . .
paercebal

5
@paercebal: você tem direito a esse ponto de vista, mas não há nada em C ++ que me motivaria a desistir de literais de ponto flutuante hexadecimal. Esse é exatamente meu ponto. É claro que os programadores de C ++ não se importam com os recursos do C99; provavelmente é por isso que eles são programadores C ++. Por outro lado, existe um mundo inteiro de programadores C por aí que não se importam de forma alguma com os recursos do C ++ e só querem que a Microsoft forneça um compilador C que pelo menos tente aderir ao padrão como todo mundo faz.
Stephen Canon,

13
@paercebal: "equivalentes" são inúteis. Existem milhões de linhas de código C portátil que funcionam muito bem em todas as outras plataformas. Você está sugerindo que eles sejam reescritos? A comunidade de usuários C99 é suficientemente grande para que todos os outros grandes fornecedores de compiladores pelo menos tentem oferecer compatibilidade: IBM, HP, Apple, Intel, GNU, Sun, ARM, inúmeros compiladores de dispositivos embarcados, etc. C99 pode não ser importante para programadores de Windows , mas os programas do Windows representam uma pequena fração do código total escrito.
Stephen Canon,

11

A partir do VC2013 preview 1 , C99, um conjunto mais diversificado de C ++ 11 e alguns padrões C ++ 14 recém-introduzidos são suportados. Confira o blog oficial para obter mais detalhes: http://blogs.msdn.com/b/vcblog/archive/2013/06/27/what-s-new-for-visual-c-developers-in-vs2013-preview. aspx

Atualizar:

De https://news.ycombinator.com/item?id=9434483 (Stephan T Lavavej aka: STL é o mantenedor da equipe STL @VC):

Especificamente, em 2015 nossa implementação da Biblioteca Padrão C99 está completa, exceto para tgmath.h (irrelevante em C ++) e as macros pragma CX_LIMITED_RANGE / FP_CONTRACT.

Confira esta postagem para obter detalhes: http://blogs.msdn.com/b/vcblog/archive/2015/04/29/c-11-14-17-features-in-vs-2015-rc.aspx .


Apenas suporte parcial para C99, tanto quanto eu posso dizer: blogs.msdn.com/b/vcblog/archive/2013/07/19/… "... Sabemos que este não é um suporte completo para as funções da biblioteca C99."
sdfqwerqaz1

@ sdfqwerqaz1, veja o comentário de STL aqui : "as equipes de compiladores e bibliotecas irão considerá-los caso a caso, mas nossa principal prioridade é a conformidade com C ++. Por exemplo, já que C ++ 11/14 incorpora o padrão C99 Biblioteca por referência, 2015 Preview suporta totalmente a C99 Standard Library (com as únicas omissões sendo tgmath.h, que requer a mágica do compilador C e não é relevante para C ++ que tem sobrecarga, e CX_LIMITED_RANGE / FP_CONTRACT que também requer suporte do compilador) " .
Vulcan Raven

8

Estive envolvido no trabalho do ISO C ++ (2000-2005), e a Microsoft fez contribuições significativas para essa linguagem. Não há dúvida de que funcionarão em C ++ 0x, mas precisarão de um pouco mais de tempo do que, digamos, a Intel. A Micosoft precisa lidar com uma base de código maior que costuma usar suas extensões proprietárias. Isso simplesmente cria uma fase de teste mais longa. No entanto, eles irão suportar a maior parte do C ++ 0x eventualmente (a exportação ainda não é amada, pelo menos pelo que eu entendo).

Quando se trata de ISO C, as pessoas que trabalham na norma não são representativas para o mercado da Microsofts. Os clientes da Microsoft podem usar o C ++ 98 se estiverem apenas procurando um C. melhor. Então, por que a Microsoft gastaria dinheiro com o C99? Claro, a Microsoft escolheu as peças a dedo, mas isso é um negócio lógico. Eles precisariam disso para C ++ 0x de qualquer maneira, então por que esperar?


7

O suporte MSVC para C infelizmente é muito insuficiente. Ele suporta apenas a parte do C99 que é um subconjunto do C ++ ... o que significa que, por exemplo, é fisicamente impossível compilar o ffmpeg ou suas bibliotecas libav * no MSVC, porque eles usam muitos recursos do C99, como elementos de estrutura nomeados. Isso é piorado pelo fato de que a libavcodec também requer um compilador que mantém o alinhamento da pilha, o que o MSVC não faz.

Eu trabalho no x264, que ao contrário do ffmpeg faz um esforço para oferecer suporte ao MSVC, embora fazer isso muitas vezes seja um pesadelo por si só. Ele não mantém o alinhamento da pilha, mesmo se você passar explicitamente a chamada de função mais alta por meio de uma função de alinhamento de pilha baseada em assembly explícita, portanto, todas as funções que exigem uma pilha alinhada devem ser desabilitadas. Também é muito chato eu não poder usar vararrays; talvez seja melhor assim, visto que, aparentemente, o GCC os pessimiza massivamente em termos de desempenho.


6

Uma postagem mais recente sobre a compatibilidade de recursos do C ++ 11 da MSVC para o MSVC 2010 e 2011 está online .


4

A Microsoft nunca expressou qualquer interesse real em se manter atualizada com o padrão c99 (que está ficando velho agora). É triste para os programadores C, mas suspeito que a Microsoft se preocupa mais com a comunidade C ++.


4

O Visual C ++ 2008 SP1 contém pelo menos partes do TR1 e, de tempos em tempos, a equipe do Visual C ++ está fazendo um blog ou falando sobre C ++ 0x, então acho que eles darão suporte em algum momento no recurso. Eu não li nada oficial, no entanto.


4

Informações atualizadas sobre este:

Existe agora (10 de novembro de 2008) um ​​"Community Tech Preview" (CTP) do VS2010 que contém uma prévia do VC10 que tem algumas partes do C ++ 0x implementadas (observe que o VC10 não terá o conjunto completo do C ++ 0x mudanças implementadas mesmo quando o VC10 é lançado):

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

Alguns detalhes sobre o que há de novo no CTP VC10:

Conforme observado no artigo acima, "O compilador Visual C ++ no Community Technology Preview (CTP) de setembro do Microsoft Visual Studio 2010 contém suporte para quatro recursos da linguagem C ++ 0x, a saber:"

  • lambdas,
  • auto,
  • static_assert,
  • referências de rvalue

3

Herb Sutter é o presidente do órgão de padrões ISO C ++ e também trabalha para a Microsoft. Eu não sei sobre o padrão Visual Studio C - principalmente porque eu nunca uso o C simples - mas a Microsoft está tentando levar o novo padrão C ++ adiante. A prova disso é - como o OregonGhost mencionou - o TR1 que está incluído no último Visual Studio Service Release.



1

O Visual C ++ Bloq fornece muitas informações sobre vários pontos interessantes em relação ao suporte do C ++ 11 no VC ++ 11, incluindo várias tabelas

  • Recursos principais da linguagem C ++ 11
  • Recursos da linguagem C ++ 11: Simultaneidade
  • Recursos da linguagem C ++ 11: C99
  • Tamanhos de contêiner x86 (bytes)
  • Tamanhos de contêineres x64 (bytes)

Blog da equipe do Visual C ++, recursos do C ++ 11 no Visual C ++ 11

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.