É possível escrever uma função que, quando compilada com um compilador C retornará 0, e quando compilada com um compilador C ++, retornará 1 (a solução trivial com
#ifdef __cplusplus
não é interessante).
Por exemplo:
int isCPP()
{
return sizeof(char) == sizeof 'c';
}
Claro, o acima só funcionará se sizeof (char)
não for o mesmo quesizeof (int)
Outra solução mais portátil é algo assim:
int isCPP()
{
typedef int T;
{
struct T
{
int a[2];
};
return sizeof(T) == sizeof(struct T);
}
}
Não tenho certeza se os exemplos estão 100% corretos, mas você entendeu. Eu acredito que existem outras maneiras de escrever a mesma função também.
Quais diferenças, se houver, entre C ++ 03 e C ++ 11 podem ser detectadas em tempo de execução? Em outras palavras, é possível escrever uma função semelhante que retornaria um valor booleano indicando se ela foi compilada por um compilador C ++ 03 em conformidade ou um compilador C ++ 11?
bool isCpp11()
{
//???
}
fonte
Respostas:
Linguagem central
Acessando um enumerador usando
::
:Você também pode abusar das novas palavras-chave
Além disso, o fato de que literais de string não são mais convertidos para
char*
Não sei qual é a probabilidade de você ter isso funcionando em uma implementação real. Aquele que explora
auto
O seguinte é baseado no fato de que
operator int&&
é uma função de conversão paraint&&
em C ++ 0x e uma conversão paraint
seguida por lógico e em C ++ 03Esse caso de teste não funciona para C ++ 0x no GCC (parece um bug) e não funciona no modo C ++ 03 para clang. Um clang PR foi arquivado .
O tratamento modificado de nomes de classes injetadas de modelos em C ++ 11:
Um par de "detectar se este é C ++ 03 ou C ++ 0x" pode ser usado para demonstrar alterações significativas. A seguir está um caso de teste ajustado, que inicialmente foi usado para demonstrar tal mudança, mas agora é usado para testar C ++ 0x ou C ++ 03.
Biblioteca Padrão
Detectando a falta de
operator void*
em C ++ 0x 'std::basic_ios
fonte
true
para o MSVC 2005 em diante e um erro de compilação no MSVC 2003.(...)
vs.(char*)
Eu realmente gosto daquilo!Eu me inspirei em Quais mudanças importantes foram introduzidas no C ++ 11? :
Isso se baseia nos novos literais de string que têm precedência sobre a expansão da macro.
fonte
#undef u8
então o uso do pré-processador só será observável se seu programa tiver uma macro definida anteriormente chamadau8
(boooo). Se essa for uma preocupação real, ainda pode ser contornada usando pragmas / chamadas de macro push / pop específicos de implementação (acredito que a maioria das implementações tem isso).Que tal uma verificação usando as novas regras para
>>
modelos de fechamento:Como alternativa, uma verificação rápida para
std::move
:fonte
std::move
?Ao contrário do C ++ anterior, C ++ 0x permite que tipos de referência sejam criados a partir de tipos de referência se esse tipo de referência de base for introduzido por meio, por exemplo, de um parâmetro de modelo:
O encaminhamento perfeito tem o preço de quebrar a compatibilidade com versões anteriores, infelizmente.
Outro teste pode ser baseado em tipos locais agora permitidos como argumentos de modelo:
fonte
isC++0x
é um identificador C ++ válido;)Este não é um exemplo totalmente correto, mas é um exemplo interessante que pode distinguir C vs. C ++ 0x (embora seja C ++ 03 inválido):
fonte
sizeof(int) != 1
ser verdade. Em um sistema 0x comchar
s excepcionalmente grandes , os resultados podem ser os mesmos. Ainda um truque legal, no entanto.char
é sempre um bytesizeof(char)
será sempre 1, por definição. MasCHAR_BIT
(definido em limits.h) pode ter mais de 8. Como resultado,char
eint
pode ter 32 bits, e nesse casosizeof(int) == 1
(eCHAR_BIT == 32
).A partir desta pergunta :
fonte
bool is_cpp0x = !test[0].flag;
T
enquanto construções de cópia C ++ 03 deT()
Embora não seja tão conciso ... No C ++ atual, o próprio nome do modelo de classe é interpretado como um nome de tipo (não um nome de modelo) no escopo desse modelo de classe. Por outro lado, o nome do modelo de classe pode ser usado como um nome de modelo em C ++ 0x (N3290 14.6.1 / 1).
fonte
fonte