Pregunta
#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_
#include <assert.h>
#define NULLCHECK(x) assert(x != (void *) 0);
#endif
Si utilizara el estilo anterior como plantilla para declarar macros, ¿qué condiciones tendrías?
Solución
-
ponga paréntesis alrededor del argumento (evita problemas al pasar expresiones)
-
no pongas; al final (el uso será más natural)
#define NULLCHECK (x) assert ((x)! = (void *) 0)
Otros consejos
En términos generales, siempre debe poner los argumentos de macro entre paréntesis en la expansión, es decir, en su caso
assert((x) != (void*) 0)
Esto se debe a que si no lo hace, entonces cualquier expresión (en lugar de simples variables) que pase puede estropear la expansión de la variable.
También sugeriría que NO pongas el punto y coma al final de la definición de la macro, por lo que tienes que llamarlo como
NULLCHECK(pSomething);
que se ve más como C & amp; consistente con el resto de tu código.
Un cambio que podría hacer sería comentar el cierre #endif
:
#endif // MACROS_NULLCHECK_H_
Hace que sea más fácil entender lo que hace #endif
cuando el archivo se hace más largo que una pantalla.
Algunas buenas prácticas de macros de la CERT C Wiki de codificación segura :
PRE00-C. Prefiere funciones en línea o estáticas a macros similares a funciones
PRE01-C. Utilice paréntesis dentro de las macros alrededor de los nombres de parámetros
PRE02-C. Las listas de reemplazo de macros deben estar entre paréntesis
PRE03-C. Prefiere typedefs a define para tipos de codificación
PRE10-C. Envolver macros de múltiples enunciados en un bucle do-while
PRE11-C. No concluya una sola definición de macro de declaración con un punto y coma
PRE31-C. Nunca invoque una macro no segura con argumentos que contengan asignación, incremento, disminución, acceso volátil o llamada de función
PRE32-C. No use directivas de preprocesador dentro de argumentos de macro
Se ve bien. Es un patrón que uso mucho.
Para hacer cumplir el ;
, use
#define NULLCHECK(x) do { assert((X)); } while (0)