[C con Clase] Macro para gestionar errores

Steven Davidson srd4121 en njit.edu
Vie Mar 6 18:36:37 CET 2009


Hola Vicente,

vicente lozano wrote:
> Vale, ahora entiendo la diferencia y la utilidad de ?, gracias.
> 
> Solo por si alguien lo lee despues, creo que los dos codigos no hacen
> lo mismo:
> 
> 1) *if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]); 
> return -1 ;}
>  *Que tabulado seria esto
> *if* *(* /-1/*==*cond* )*
> *{*
>  fprintf(stderr, /"ERROR: %s.\n"/, ERRORS[errn])*;*
>  return /-1/ *;*
> *}*
> 
> 2) -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]) : -1
>  Que es equivalente a declarar esta funcion: (pongo ints en lugar de 
> bools porque todavia no tengo muy claro en C++ como va)
> * int* interrogante ( *int *exprBool )
>  *{*
>   *if (* cond *)*
>    *return(* fprintf(stderr, /"ERROR: %s.\n"/, ERRORS[errn])* );*
> * else*
>    *return* /-1/*;*
> * }
> *Y utilizarla luego asi:
> * interrogante(/ -1/ ==* cond *);
> *
> Espero no haberme equivocado, solo lo pongo por evitar posibles 
> confusiones en posteriores lecturas del hilo.
> 

Tienes toda la razón del mundo. Me equivoqué al interpretar el código. 
Entonces la expresión equivalente a la sentencia 'if' que hiciste sería así:

#define check(cond,errn)\
   ( (-1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]) : 0), -1 )

Con esto forzamos un "retorno" de -1. No estoy muy seguro por qué 
quieres retornar -1, pero esta macro lo haría.

Ahora bien, si querías usar este código dentro de una función, como 
puede ser 'main()', entonces esa sentencia 'return' de tu macro original 
sí tiene repercusiones fuera del contexto de esta macro. Me temo que no 
podemos sustituir esa funcionalidad con código estrictamente escrito en 
C++. Supongo que podríamos usar la función 'exit()' si usamos la macro 
en 'main()'.


Perdonad la confusión que podría haber ocasionado con mi despiste.

Hasta pronto,

Steven





Más información sobre la lista de distribución Cconclase