[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