[C con Clase] Macro para gestionar errores

Steven Davidson srd4121 en njit.edu
Jue Mar 5 21:01:00 CET 2009


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





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