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.
Esto se solucionó hace aproximadamente un mes (para gcc 4.7.0). El informe de errores hace una lectura interesante: gcc.gnu.org/bugzilla/show_bug.cgi?id=1773
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.