El Gnu C++ compilador parece definir __cplusplus
ser 1
Gnu C++ macro __cplusplus estándar conformes?
#include <iostream>
int main() {
std::cout << __cplusplus << std::endl;
}
Esto imprime 1
con gcc en C++ estándar modo, así como en C++ 0x modo, con gcc 4.3.4, y gcc 4.7.0.
El C++ 11 FDIS dice en "16.8 nombres de macros predefinidas [cpp.predefined]" que
El nombre
__cplusplus
se define como el valor 201103L al compilar una unidad de traducción de C++. (Nota: Se pretende que las futuras versiones de esta norma reemplazará el valor de esta macro con un valor mayor no conformes com- pilers debe utilizar un valor con un máximo de cinco dígitos decimales..)
El viejo std C++ 03 tenía una regla similar.
¿El GCC establece deliberadamente esto en 1
, porque es "no conforme"?
Al leer esa lista, pensé que podría usar __cplusplus
para verificar de forma portátil si tengo un compilador habilitado para C++ 11. Pero con g ++ esto no parece funcionar. Sé acerca de la macro ...EXPERIMENTAL...
, pero tengo curiosidad por qué g ++ está definiendo __cplusplus
de esta manera.
Mi problema original era cambiar entre diferentes variantes de puntero nulo. Algo como esto:
#if __cplusplus > 201100L
# define MYNULL nullptr
#else
# define MYNULL NULL
#endif
¿Hay una manera simple y razonablemente portátil para poner en práctica un interruptor de este tipo?
Nota al margen: no he leído completamente este hilo, pero esto fue reconocido como un error en g ++ (¡hace 10 años!) y está corregido en 4.7.0: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 – birryree
¿Qué tal '' #ifndef nullptr' '#define nullptr NULL'' # endif' o' #ifdef nullptr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –