Gnu C ++ macro __cplusplus padrão está em conformidade?
O compilador Gnu C ++ parece definir__cplusplus
ser estar1
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
This prints1
com gcc no modo c ++ padrão, bem como no modo C ++ 0x, comgcc 4.3.4 e gcc 4.7.0.
O C ++ 11 FDIS diz em "16.8 Nomes de macro predefinidos [cpp.predefined]" qu
O nome__cplusplus
é definido comovalue 201103L ao compilar uma unidade de tradução C ++. (Nota de rodapé: Pretende-se que as versões futuras desta norma substituam o valor dessa macro por um valor maior. Os compiladores não conformes devem usar um valor com no máximo cinco dígitos decimais.)
O antigo C ++ 03 padrão tinha uma regra semelhant
O GCC está definindo isso deliberadamente para1
, porque é "não conforme"?
Ao ler essa lista, pensei que poderia usar__cplusplus
para verificar de maneira portátil se eu tenho um compilador habilitado para C ++ 11. Mas comg ++ isso não parece funcionar. Eu sei sobre o...EXPERIMENTAL...
macro, mas ficou curioso por queg ++ está definindo__cplusplus
por aqui
Meu problema original era alternar entre diferentes variantes de ponteiro nulo. Algo assim
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
Existe uma maneira simples e razoavelmente portátil de implementar essa opçã