Do Bjarne Stroustrup C ++ 0x FAQ :
__cplusplus
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.
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).