usa que para libreria ifdef example c++ c coding-style macros undef

c++ - para - que es#ifdef en c



¿Cuándo necesitamos#ifdef antes de#undef? (3)

Estoy seguro de que es un artefacto de la historia. Como se mencionó en la respuesta de jdigital , la segunda edición de K&R dice

No es erróneo aplicar #undef a un identificador desconocido.

Sin embargo, esa frase no se encuentra en la edición de 1978. Estoy bastante seguro de que los compiladores pre-estándar a menudo arrojarán un error si intentas #undef una macro no definida.

Además, la justificación ANSI C dice :

Se permite explícitamente #undef una macro que no tiene una definición actual.

Me imagino que si ya fuera una práctica universal, no habría necesidad de explicarlo en el razonamiento.

Dicho todo esto, no es necesario en el código moderno, pero tampoco duele mucho.

En muchos de los archivos C y C ++ he visto macros como esta:

#ifdef X #undef X // no statements in between #endif

Siento que, es adecuado simplemente escribir:

#undef X

Si la macro X no estaba definida, entonces #undef debería tener ningún efecto.

¿Es correcto poner #undef autónomo, si solo deseo no definir una macro? ¿Eso hace que la práctica de codificación sea mala?


Kernighan y Ritchie (2ª edición) están de acuerdo contigo.

EDITAR: cita de la fuente (sección A12.3):

Una línea de control de la forma.

# undef identifier

hace que se olvide la definición del preprocesador del identificador. Si no es erróneo, aplicar #undef a un identificador desconocido.


Ver ISO C99 6.10.3.5 párrafo 2.

Una directiva de preprocesamiento de la forma.

# undef identifier new-line

hace que el identificador especificado ya no se defina como un nombre de macro. Se ignora si el identificador especificado no está definido actualmente como un nombre de macro.

Incluso Visual C ++ 6 (que era notorio por el mal cumplimiento de los estándares) lo permite:

También puede aplicar la directiva #undef a un identificador que no tiene una definición previa. Esto asegura que el identificador está indefinido. El reemplazo de macros no se realiza dentro de las sentencias #undef .