none - nullptr c++
#define NULL NULL (7)
¿eso no define simplemente NULL como la secuencia de caracteres "NULL"?
#ifndef NULL
#define NULL NULL
#endif
Este código se compila en gcc sin advertencias / errores. ¿Puede alguien explicar qué está haciendo el preprocesador aquí?
Claramente, esto no se está utilizando como una macro, se está utilizando como una bandera de compilación. ¿Hay otras áreas del código donde ve #ifdef NULL
o #ifndef NULL
?
Es muy extraño usar "NULO", específicamente, como una bandera, pero he visto extraño ( #define TRUE FALSE
) ...
En cualquier lugar que el compilador vea el texto "NULO", lo reemplazará con el texto "NULO". Es como hacer una búsqueda y reemplazo en su código para "NULO" y reemplazarlo por "NULO". No es ilegal, simplemente extraño :)
En respuesta a la pregunta de qué está haciendo el preprocesador:
A menos que haya un código anterior que no define NULL, se está saltando el #define NULL NULL
completo. NULL casi seguramente ya está definido. En C ++, se prefiere el uso de 0 debido a la comprobación de tipos más ajustada de C ++. Si debe usar NULL, es mejor declarar const int NULL = 0;
(ver la Sección 5.1.1 de Stroustrup).
Es normal:
#ifndef JON_SKEET
#define JON_SKEET JON_SKEET
#endif
Esto compila también. Esto se debe a que el preprocesador simplemente reemplaza sin sentido. Lo que reemplaza y lo que reemplaza no necesita ser identificadores válidos.
Piénselo de esta manera: abra la ventana Buscar y Reemplazar de su editor y escriba "NULO" en los campos Replace
y Replace with
. No dará ningún error o advertencia y "funcionará", aunque en realidad no haga nada. El preprocesador hace lo mismo.
Obviamente cuando intentas usarlo:
''JON_SKEET'' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.)
He visto casos en los que un código como este genera un valor desde el espacio de nombres del compilador ("espacio de nombres" en general, no namespace
C ++) al espacio de nombres del preprocesador, por ejemplo :
// In the compiler namespace, not in the preprocessor namespace
static int const FOO = 1234;
// Bring the constant into the preprocessor namespace as well
#ifndef FOO // <---- FOO really is undefined here.
#define FOO FOO
#endif
Cosas realmente feas
Personalmente no he encontrado un uso para este tipo de cosas, pero existe no obstante.
EDITAR : Mientras he visto esto, no sé por qué sería útil, aparte de comprobar si " FOO
" se define como un símbolo preprocesador en otro lugar en el código; quizás al tratar con algún código heredado. ¿Nadie?
La única razón posible para hacer esto sería hacerlo antes de incluir archivos de encabezado que a su vez hagan algo como
#ifndef NULL
#define NULL (void *)0
#endif
Esto evitaría que el NULL se defina así.