2012-05-08 16 views
7

Duplicar posible:
“Backporting” nullptr to C++-pre-C++0x programs¿Cómo se define nullptr para admitir C++ 03 y C++ 11?

¿Cómo definir nullptr para apoyar tanto C++ y C++ 03 11?

¿El código se compila a continuación tanto con C++ y C++ 03 11 compila sin cambiar el significado de nullptr en C++ 11 compilador?

#include <cstddef> 

#if !defined(nullptr) 
#define nullptr NULL 
#endif 
+5

¿Es correcto? No en realidad no. Si 'NULL' fuera equivalente a' nullptr', no habría habido ninguna razón para introducir la función en primer lugar. ¿Qué nos estás preguntando? Si su código * compila * –

+4

Comprobar esta solución: http://stackoverflow.com/questions/8747005/backporting-nullptr-to-c-pre-c0x-programs – Alexander

+7

'definido (nullptr)' fallará, porque 'nullptr' es una palabra clave, no una definir. – Griwes

Respuesta

10

En C++ 11, nullptr es de tipo nullptr_t. Una de sus grandes ventajas en comparación con NULL (o al 0 diría Bjarne ya que no le gusta macros) es que entre estas dos funciones:

void foo(char*); 
void foo(int); 

foo(nullptr) llamarán la sobrecarga char* pero foo(NULL) llamarán la sobrecarga int. Por lo tanto, su solución puede funcionar en la mayoría de los casos, pero puede tener errores con la sobrecarga de funciones.

+7

Ciertamente no la * única * ventaja. También puede sobrecargar 'nullptr_t', y eso es bastante útil. –

+3

La deducción del argumento de la plantilla deduce 'nullptr_t' para' nullptr' y 'int' para' NULL'. –

8

AFAIK no puede automatizar desde el código la detección de nullptr soporte.

En la práctica, se puede leer que, como “ ” imposible, que es un ’ bastante fuerte “ ” yo sepa.

Lo que hay que hacer es, por lo tanto, usar código específico del compilador y/o comando de compilación. Por ejemplo, en cada fuente pertinente añadir un

#include <cpp/nullptr.h> 

y en el comando de generación ajustar la ruta de inclusión de manera que para el compilador con nullptr apoyo, esta recoge una cabecera vacío, mientras que para un viejo compilador que carece nullptr, se toma un encabezado que lo define à la Meyers (decir).

¡Y luego pruébelo muy bien!

Llamo al concepto general de tener múltiples versiones de un encabezado, con solo uno seleccionado por el comando de compilación, un encabezado virtual . Es posible construir una gran cantidad de maquinaria en torno a eso, incluidas las convenciones que solo tienen sentido en un caso más general. Afortunadamente, ’ no es necesario para este caso en particular, pero quizás valga la pena tenerlo en cuenta.

Resumiendo: hacer que el código fuente C++ hacer las cosas mágicamente no es el camino a seguir aquí. Agregar un poco de ayuda en el nivel de compilación parece correcto. :-)

+1

"AFAIK no se puede automatizar desde el código la detección de soporte nullptr" al menos, no de una manera que cubra los compiladores no conformes, que en la práctica es aproximadamente todos ellos. En compiladores conformes, podría hacerlo, ya que un compilador de C++ 03 garantiza que no admite 'nullptr' como palabra clave, mientras que un compilador de C++ 11 lo garantiza. Entonces, todo lo que necesita hacer es verificar cuál. –

+0

@Steve: sí. :-) él él –

Cuestiones relacionadas