[C con Clase] Preprocesador

Alejandro alepelexo en yahoo.es
Vie Mar 16 21:51:07 CET 2007


Muchas gracias Steven, me parece que lo he entendido todo.

Un saludo, Alejandro.

El pasado 2007-03-16 16:59:10, Steven Davidson escribió:
 
SD> Hola Alejandro,
SD> El pasado 2007-03-16 15:45:34, Alejandro escribió:
SD> A> Hola, tengo tres dudas con el capítulo del preprocesador:
SD> A>  
SD> A> 1. ¿Puedo definir variables dentro de un #if o #elif?
SD> A>     Ej:
SD> A>         .....
SD> A>         #ifndef MOSTRAR
SD> A>             #define MOSTRAR(a) a
SD> A>             int k = 18;
SD> A>         #endif
SD> A>         .....
SD> A>       
SD> A>     ¿Es correcto?
SD> A>  
SD> Sí. Se puede hacer. Recuerda que las directivas del precompilador no son controladas por el compilador. Por lo tanto, cualquier escrito que el preprocesador se encuentre, que no sea una directiva o algna macro a expandir, se dejará intacto e in situ para ser analizado y traducido por el compilador.
SD> A> 2. ¿Qué hace la directiva #line? Algún ejemplo, por favor.
SD> A>  
SD> Bueno, como explica el curso, ya no se usa. Típicamente, aquellas herramientas que generan código C/C++ usaban esta directiva para modificar el número de línea del código y optativamente el fichero originario. Por ejemplo,
SD> // main.c
SD> int main()
SD> {
SD>   #line 100 "defs.c"
SD>   int b;
SD>   float f = var;
SD>   ...
SD> }
SD> Obviamente, tendremos un error con la inicialización de 'f' en la línea 7 de "main.c". Sin embargo, algo indicar #line, el compilador informa del error pero no la línea ni fichero que pensamos. El compilador dará el mensaje:
SD> Identificador inválido: 'var' en la línea 101 en "defs.c"
SD> A> 3. ¿Y la #pragma? Ejemplos también, si es posible.
SD> A>  
SD> La directiva #pragma realmente sirve para programar el compilador específico que estés usando. Por ejemplo,
SD> #pragma argsused
SD> int main( int argc, char **args )
SD> {
SD>   cout << "hola mundo\n";
SD>   return 0;
SD> }
SD> Bajo los compiladores de Borland, el argumento 'argsused' de la directiva #pragma funciona. Si no usáramos #pragma, Borland nos daría un aviso relacionado con los argumentos de la función, ya que los declaramos, pero no los usamos. Usando esta directiva se suprime este aviso en la compilación.
SD> Otro ejemplo,
SD> struct algo
SD> {
SD>   char car;
SD>   short num;
SD>   char letra;
SD> };
SD> Seguramente la organización de los datos miembros de 'algo' es la siguiente:
SD> 'car'   comienza en el byte #0 y ocupa 1 byte,
SD> 'num'   comienza en el byte #1 y ocupa 2 bytes,
SD> 'letra' comienza en el byte #3 y ocupa 1 byte,
SD> La estructura 'algo' ocupa 4 bytes, si suponemos que la agrupación es de 4 bytes.
SD> Podemos cambiar el alineamiento de los bytes con 'pack()', que suele ser una opción popular implementada por varios compiladores:
SD> #pragma pack(2)
SD> struct algo
SD> {
SD>   char car;
SD>   short num;
SD> };
SD> Ahora, la organización se basa en un alineamiento de 2 bytes que será:
SD> 'car'   comienza en el byte #0 y ocupa 1 byte,
SD> 'num'   comienza en el byte #2 y ocupa 2 bytes,
SD> 'letra' comienza en el byte #4 y ocupa 1 byte,
SD> La estructura 'algo' ocupa 6 bytes.
SD> Como ahora todo se "empaqueta" en grupos de 2 bytes, 'num' no cabe en el primer bloque, y por tanto aparece en el segundo.
SD> Otro ejemplo popular es 'once' para indicar que un fichero de cabecera sólo se incluye la primera vez. Por ejemplo,
SD> // "prototipos.h"
SD> #pragma once
SD> int func();
SD> double g();
SD> La manera estándar de hacer lo anterior es usando otras directivas del precompilador. Por ejemplo,
SD> // "prototipos.h"
SD> #ifndef _PROTOTIPOS_H_
SD> #define _PROTOTIPOS_H_
SD> int func();
SD> double g();
SD> #endif
SD> Nuevamente, recuerda que ni 'argsused' ni 'pack()' ni 'once' son estándares. Algunos compiladores las aceptan, pero otros no.
SD> Espero haber aclarado las inquietudes que tenías.
SD> Steven
SD> _______________________________________________
SD> Lista de correo Cconclase Cconclase en listas.conclase.net
SD> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
SD> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


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