c++ gcc c++11 standards-compliance c++-standard-library

Gnu C++ macro__cplusplus estándar conformes?



gcc c++11 (3)

El compilador Gnu C ++ parece definir __cplusplus como 1

#include <iostream> int main() { std::cout << __cplusplus << std::endl; }

Esto imprime 1 con gcc en modo estándar de C ++, así como en modo C ++ 0x, con gcc 4.3.4 y gcc 4.7.0.

El C ++ 11 FDIS dice en "16.8 nombres de macro predefinidos [cpp.predefined]" que

El nombre __cplusplus se define con el valor 201103L al compilar una unidad de traducción C ++. (Nota al pie: se pretende que las versiones futuras de este estándar reemplacen el valor de esta macro por un valor mayor. Los compradores no conformes deben usar un valor con un máximo de cinco dígitos decimales).

El viejo estándar C ++ 03 tenía una regla similar.

¿El GCC establece deliberadamente esto en 1 , porque es "no conforme" ?

Al leer la 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. Conozco el ...EXPERIMENTAL... macro, pero tengo curiosidad por qué g ++ está definiendo __cplusplus esta manera.

Mi problema original fue cambiar entre diferentes variantes de puntero nulo. Algo como esto:

#if __cplusplus > 201100L # define MYNULL nullptr #else # define MYNULL NULL #endif

¿Existe una forma simple y razonablemente portátil de implementar dicho cambio?


Es un bug muy viejo de g ++.

Es decir, el compilador no se está conformando.

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

EDITAR : 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.

Saludos y hth.



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.