pointer none ejemplo define c++ null keyword

none - nullptr c++



C++ NULL vs__null (3)

Tengo el siguiente código:

MyType x = NULL;

NetBeans me dio una sugerencia para cambiarlo a esto:

MyType x = __null;

Lo busqué y descubrí que __null se llama "palabra clave del compilador", que asumí que significa que se usa internamente para el compilador. No entiendo por qué NetBeans sugirió cambiarlo a una palabra clave del compilador.

¿Cuál es la diferencia entre NULL y __null en c ++?


NULL es el antiguo símbolo C para un puntero nulo. C ++ tradicionalmente ha usado 0 para los punteros nulos, y desde el estándar de C ++ 11 nullptr .

Teniendo en cuenta que x no parece ser un puntero, entonces no puede inicializar x para ser un puntero nulo, y el símbolo __null es quizás un símbolo interno del compilador para un valor nulo (que es un concepto que realmente no existe). en el estándar C ++).

Si desea que x inicialice en algún estado predeterminado, debe confiar en el constructor predeterminado MyClass para inicializar los objetos y sus variables miembro a algunos valores predeterminados adecuados.


NULL ha sido superado de C a C ++ y, antes de C ++ 11, adoptó su significado de C:

hasta C ++ 11: La macro NULL es una constante de puntero nulo definida por la implementación, que puede ser una constante constante rvalue de tipo entero que se evalúa a cero.

C ++ 11 luego introdujo un puntero nulo dedicado literal nullptr de tipo std::nullptr_t . Pero, probablemente por compatibilidad con versiones anteriores, la macro NULL no se eliminó; su definición fue un poco relajada, ya que los compiladores ahora pueden definirla como integral o como tipo de puntero:

C ++ 11 en adelante: un literal entero con valor cero, o un prvalue de tipo std :: nullptr_t

Si usa NULL , entonces obtiene un comportamiento definido por la implementación en la resolución de sobrecarga. Considere, por ejemplo, el siguiente código con un compilador que usa la versión integral de NULL -macro. Luego, una llamada que usa NULL como parámetro pasado a una función puede llevar a ambigüedades:

struct SomeOverload { SomeOverload(int x) { cout << "taking int param: " << x << endl; } SomeOverload(void* x) { cout << "taking void* param: " << x << endl; } }; int main() { int someVal = 10; SomeOverload a(0); SomeOverload b(&someVal); // SomeOverload c(NULL); // Call to constructor is ambiuous SomeOverload d(nullptr); }

Por lo tanto, se recomienda utilizar nullptr siempre que desee expresar el tipo de puntero.

Y no use __null , ya que es una constante no portátil específica del compilador; nullptr , por el contrario, es perfectamente portátil.


__null es una cosa interna de g++ que sirve aproximadamente para el mismo propósito que la nullptr estándar agregada en C ++ 11 (que actúa de manera consistente como un puntero, nunca como un entero).

NULL se define como 0 , que puede usarse implícitamente como entero, booleano, valor de punto flotante o puntero, lo cual es un problema cuando se trata de resolución de sobrecarga, cuando se desea llamar a la función que toma un puntero específicamente.

En cualquier caso, no debe usar __null porque es un detalle de implementación de g++ , por lo que usarlo garantiza un código no portátil. Si puede confiar en C ++ 11 (seguramente ya puede nullptr ), use nullptr . Si no, NULL es tu única opción portátil.