@Mat: Posto e encerrado porque a pergunta era uma porcaria e tinha algum outro absurdo arbitrário em cima dela. Eu reenviei em uma forma decente. Ficaria feliz em fechar este se parecer que o original será consertado e revivido, mas não estou prendendo a respiração.
Lightness Races in Orbit de
1
@Mat: Bem, a melhor resposta não é uma lista estática de compiladores, mas um meio de determinar por si mesmo o que está em uso. Então aí está.
Lightness Races in Orbit de
1
@Als: Será em breve. Eu prometo. Além disso, a c++-faqtag não tem nenhum pré-requisito real "número de vezes solicitado" que você tenha que passar; é mais sobre o formato e a generalidade da coisa.
Lightness Races in Orbit de
Respostas:
13
Pelo que sei, não há uma maneira geral de fazer isso. Se você olhar os cabeçalhos das bibliotecas de suporte de plataforma cruzada / compilador múltiplo, você sempre encontrará muitas definições que usam construções específicas do compilador para determinar tais coisas:
/*Define Microsoft Visual C++ .NET (32-bit) compiler */#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)...#endif/*Define Borland 5.0 C++ (16-bit) compiler */#if defined(__BORLANDC__) && !defined(__WIN32__)...#endif
Você provavelmente terá que fazer essas definições sozinho para todos os compiladores que usar.
Em C ++ 0x a macro __cplusplusserá definida com um valor diferente (maior que) do atual 199711L.
Embora isso não seja tão útil quanto você gostaria. gcc(aparentemente por quase 10 anos) tinha esse valor definido como 1, descartando um grande compilador, até que foi corrigido quando o gcc 4.7.0 foi lançado .
Estes são os padrões C ++ e qual valor você deve esperar em __cplusplus:
C ++ pré-C ++ 98: __cplusplusé1 .
C ++ 98: __cplusplusé199711L .
C ++ 98 + TR1: Lê-se como C ++ 98 e não há como verificar se eu conheço.
C ++ 11: __cplusplusé201103L .
C ++ 14: __cplusplusé201402L .
C ++ 17: __cplusplusé 201703L.
Se o compilador for mais antigo gcc, precisamos recorrer a hackeamentos específicos do compilador (veja uma macro de versão, compare-a a uma tabela com recursos implementados) ou use Boost.Config (que fornece macros relevantes ). A vantagem disso é que podemos escolher recursos específicos do novo padrão e escrever uma solução alternativa se o recurso estiver ausente. Freqüentemente, isso é preferido em vez de uma solução de atacado, pois alguns compiladores afirmam implementar C ++ 11, mas oferecem apenas um subconjunto dos recursos.
Infelizmente, uma verificação mais refinada de recursos (por exemplo, funções de biblioteca individuais como std::copy_if) só pode ser feita no sistema de compilação de seu aplicativo (execute o código com o recurso, verifique se ele compilou e produziu resultados corretos - autoconfé a ferramenta de escolha se usar esta rota).
Não parece que os fornecedores de compiladores estão atualizando isso - talvez eles estejam esperando até que estejam totalmente em conformidade com o padrão? ( Stackoverflow.com/q/14131454/11698 )
Richard Corden
2
@prnr: Isso pode ser verdade, mas cabe ao usuário que fez a pergunta decidir qual resposta aceitar. No momento em que a resposta atualmente marcada como aceita foi postada, ela estava correta, portanto o autor da postagem original a aceitou. Esse usuário pode decidir alterar a resposta aceita, mas pode não estar mais ativo no site. Consulte: meta.stackexchange.com/questions/120568/…
É engraçado, porque nos estúdios visuais o valor de __cplusplus é 199711L e o código que você postou retornou c ++ 98, entretanto, usei recursos do c ++ 14 incluindo modelos de variáveis e decltype (auto). É possível que a versão errada da macro tenha sido implementada?
@DaanTimmer Estou confuso com aquele artigo, parece assumir conhecimento de como usar a /Zc:__cplusplusflag. Não posso simplesmente std::cout << /Zc:__cplusplus;porque dois pontos e barras não podem fazer parte dos nomes das variáveis, é claro. Você consegue explicar como fazer isso? Obrigado.
Dependendo do que você deseja alcançar, Boost.Config pode ajudá-lo. Ele não fornece detecção da versão padrão, mas fornece macros que permitem verificar o suporte de linguagem / recursos de compilador específicos.
Verificar os recursos é provavelmente uma ideia melhor do que verificar as versões padrão. Poucos compiladores suportam tudo de um padrão, mas se todos eles suportam o número limitado de recursos de que você precisa, então realmente não importa se o restante dos recursos de um determinado padrão estão implementados e funcionando corretamente.
Rob Kennedy
4
__cplusplus
Em C ++ 0x, a macro __cplusplus será definida com um valor diferente (maior que) do atual 199711L.
Se __STDC__está definido e qual é seu valor, são definidos pela implementação em C ++.
Rob Kennedy
@Rob: Sim, é. @Tor: Tentei no VC ++ 2005, mas diz que STDC é um identificador não declarado. No entanto, ele é listado como uma dessas macros predefinidas. No entanto, STDC_VERSION não existe.
jasonline
Isso informa a versão da linguagem de programação C suportada pelo compilador. Não diz nada sobre a versão da linguagem C ++ que é compatível.
Dan Molding
0
Normalmente você deve usar __cplusplusdefine para detectar c ++ 17, mas por padrão o compilador da Microsoft não define essa macro corretamente, consulte https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ - você precisa para modificar as configurações do projeto para incluir a /Zc:__cpluspluschave, ou você pode usar uma sintaxe como esta:
c++-faq
tag não tem nenhum pré-requisito real "número de vezes solicitado" que você tenha que passar; é mais sobre o formato e a generalidade da coisa.Respostas:
Pelo que sei, não há uma maneira geral de fazer isso. Se você olhar os cabeçalhos das bibliotecas de suporte de plataforma cruzada / compilador múltiplo, você sempre encontrará muitas definições que usam construções específicas do compilador para determinar tais coisas:
Você provavelmente terá que fazer essas definições sozinho para todos os compiladores que usar.
fonte
Do Bjarne Stroustrup C ++ 0x FAQ :
Embora isso não seja tão útil quanto você gostaria.
gcc
(aparentemente por quase 10 anos) tinha esse valor definido como1
, descartando um grande compilador, até que foi corrigido quando o gcc 4.7.0 foi lançado .Estes são os padrões C ++ e qual valor você deve esperar em
__cplusplus
:__cplusplus
é1
.__cplusplus
é199711L
.__cplusplus
é201103L
.__cplusplus
é201402L
.__cplusplus
é201703L
.Se o compilador for mais antigo
gcc
, precisamos recorrer a hackeamentos específicos do compilador (veja uma macro de versão, compare-a a uma tabela com recursos implementados) ou use Boost.Config (que fornece macros relevantes ). A vantagem disso é que podemos escolher recursos específicos do novo padrão e escrever uma solução alternativa se o recurso estiver ausente. Freqüentemente, isso é preferido em vez de uma solução de atacado, pois alguns compiladores afirmam implementar C ++ 11, mas oferecem apenas um subconjunto dos recursos.O Stdcxx Wiki hospeda uma matriz abrangente para suporte do compilador de recursos C ++ 0x (se você se atrever a verificar os recursos você mesmo).
Infelizmente, uma verificação mais refinada de recursos (por exemplo, funções de biblioteca individuais como
std::copy_if
) só pode ser feita no sistema de compilação de seu aplicativo (execute o código com o recurso, verifique se ele compilou e produziu resultados corretos -autoconf
é a ferramenta de escolha se usar esta rota).fonte
__cplusplus
apenas no VS 15.7. Veja o blog da equipe do Visual C ++Por favor, execute o seguinte código para verificar a versão.
fonte
/Zc:__cplusplus
)/Zc:__cplusplus
flag. Não posso simplesmentestd::cout << /Zc:__cplusplus;
porque dois pontos e barras não podem fazer parte dos nomes das variáveis, é claro. Você consegue explicar como fazer isso? Obrigado.Dependendo do que você deseja alcançar, Boost.Config pode ajudá-lo. Ele não fornece detecção da versão padrão, mas fornece macros que permitem verificar o suporte de linguagem / recursos de compilador específicos.
fonte
C ++ 0x FAQ por BS
fonte
Use
__cplusplus
conforme sugerido. Apenas uma nota para o compilador Microsoft, use aZc:__cplusplus
chave do compilador para habilitar__cplusplus
Fonte https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
fonte
Depois de um rápido google :
__STDC__
e__STDC_VERSION__
veja aquifonte
__STDC__
está definido e qual é seu valor, são definidos pela implementação em C ++.Normalmente você deve usar
__cplusplus
define para detectar c ++ 17, mas por padrão o compilador da Microsoft não define essa macro corretamente, consulte https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ - você precisa para modificar as configurações do projeto para incluir a/Zc:__cplusplus
chave, ou você pode usar uma sintaxe como esta:fonte