[C con Clase] Macro para gestionar errores

vicente lozano vicentelozano en gmail.com
Vie Mar 6 09:56:20 CET 2009


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.

Gracias a todos por vuestro tiempo y ayuda.
2009/3/5 Steven Davidson <srd4121 en njit.edu>

> Hola Vicente,
>
> vicente lozano wrote:
>
>> Que diferencia a bajo nivel hay entre el uso de ? y el if, en que se
>> traducen en ensamblador?
>>
>>
> Programante ya te ha contestado, pero quería agregar a lo que dijo.
>
> En tu caso, estabas usando 'if' dentro de una macro. Lo cambié por el
> operador ?: porque así la macro se basa en una expresión y no en una
> sentencia. Así podíamos usar la macro prácticamente en cualquier lugar. Para
> que se vea claramente este tema, pongo las macros:
>
> #define check_if(cond,errn)\
>  if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]); return -1
> ;}
>
> #define check_op(cond,errn)\
>  ( -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[errn]) : -1 )
>
> int main()
> {
>  int cond;
>
>  do
>  {
>    ...
>  } while( check_if(cond,0) != -1 );
>
>  return 0;
> }
>
> Esto no funcionaría y el compilador te habría dado un sinfín de errores
> gramaticales. Esto es porque realmente estarías escribiendo lo siguiente:
>
> do
> {
>  ...
> } while( if ( -1==cond ) { fprintf(stderr, "ERROR: %s.\n", ERRORS[0]);
> return -1 ;} != -1 );
>
> Como puedes ver, esto no tiene ni pies ni cabezas, porque dentro de 'while'
> se espera una expresión, pero en su lugar se encuentra una sentencia.
>
> Si por el contrario, usamos la versión ?:, entonces tenemos lo siguiente:
>
> do
> {
>  ...
> } while( check_op(cond,0) != -1 );
>
> Esto se traduciría a lo siguiente:
>
> do
> {
>  ...
> } while( ( -1==cond ? fprintf(stderr, "ERROR: %s.\n", ERRORS[0]) : -1 ) !=
> -1 );
>
> Obviamente, esto sí está permitido, porque el operador ?: es válido dentro
> de 'while'.
>
>
> El grave problema de las macros es que son muy traicioneras si no están
> bien definidas ni bien usadas. Los programadores que piensan que las macros
> son funciones les espera una sorpresa desagradable. Por eso, en C++, se
> desaconseja usar macros y usar funciones, porque tenemos ciertas
> expectativas acerca del funcionamiento de las funciones - valga la
> redundancia.
>
>
> Espero haber aclarado el tema.
>
> Steven
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090306/ca2f62bb/attachment.html>


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