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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top