2011-09-23 20 views
30

El Gnu C++ compilador parece definir __cplusplus ser 1Gnu 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?

+13

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

+0

¿Qué tal '' #ifndef nullptr' '#define nullptr NULL'' # endif' o' #ifdef nullptr' '#define MYNULL nullptr'' # else' '#define MYNULL NULL'' # endif' –

Respuesta

28

Esto se arregló hace aproximadamente un mes (para gcc 4.7.0). El informe de errores hace una lectura interesante: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773

+0

Whow, actualicé mi árbol svn la semana pasada, pero no había ejecutado el código de prueba en * ese * compilador. Espera ... ¡Sí, tienes razón! gcc-4.7.0 de la semana pasada: './define-cplusplus.x 199711' – towi

+3

+1 para el enlace del informe de errores. Muy interesante. – Joe

+1

El error estuvo abierto por más de 10 años ... Interesante leer de hecho. – Richard

0

Es un error muy antiguo de g ++.

Es decir, el compilador no es conforme.

Aparentemente no se puede arreglar porque arreglarlo podría romper algo en una plataforma loca.

EDIT: oh, veo por el comentario de @ birryree que acaba de ser corregido, en la versión 4.7.0. Entonces, no fue imposible de arreglar después de todo. Je.

Cheers & hth.

0

Si recuerdo correctamente, esto tiene que ver con Solaris 8, que causa problemas cuando __cplusplus se establece como debería. El equipo de gcc decidió en ese momento apoyar la plataforma Solaris 8 en lugar de cumplir con esta cláusula en particular. Pero noté que la última versión de gcc termina con el soporte de Solaris 8, y supongo que este es un primer paso en la dirección correcta.