[C con Clase] Dudas

Steven Davidson steven en conclase.net
Mar Mar 6 16:32:12 CET 2007


Hola Alejandro,

El pasado 2007-03-06 15:08:31, Alejandro escribió:

A> Bien, creo que ya casi he entendido lo de los punteros, pero ahora me han surgido otras dudas:
A> Si yo escribo "#define TAM_ARRAY 15", ¿luego puedousar eso como dimensiones de un array sin ningún problema? Ej:
A> int array[TAM_ARRAY];

Sí. Sin embargo, bajo C++, es recomendable definir constantes usando el lenguaje de C++, y así no basarnos en las constantes simbólicas del precompilador.

A> ¿Me podéis expliar a lo que os referís con "expandir las macros" en un "#define"?

Básicamente, seguimos las definiciones de las macros hasta culminar en su expresión resultante donde se sustituyen las constantes y macros por expresiones o literales. Por ejemplo,

#define NMAX 120
#define MAX (NMAX << 5)
#define ABN(f) ( f(MAX) / MAX )

float func( float f )
{
  return f*f-2;
}
...
float num = ABN(func);

El precompilador generará otro fichero fuente que a veces se llama "unidad de traducción" según las directivas indicadas. En el caso anterior, el precompilador generará el siguiente código:

float func( float f )
{
  return f*f-2;
}
...
float num = ( func( (120 << 5) ) / (120 << 5) );

Como puedes ver, el precompilador no hace una sola sustitución de la macro 'ABN', sino que sigue expandiendo cada macro y constante simbólica que se encuentre. La expansión del código se puede ver claramente. Escribir unos cuantos caracteres da lugar a una cantidad mayor. Dicho de otro modo, hemos ido de:

ABN(func)

a:

( func( (120 << 5) ) / (120 << 5) )

A> ¿Por qué yo escribo "#include <iostream>" o "#include "iostream"" en lugar de "#include<iostream.h>" o "#include "iostream.h"" y sin embargo escribo '#include "mi_fichero_de_cabecera.h"'?

Primeramente, escribir <> no es lo mismo que "" para la directiva de #include. En el primer método, el precompilador busca en los directorios del compilador, mientras que usando las comillas "", comienza a buscar por el fichero en el directorio actual.

En cuanto a colocar la extensión ".h" o no, no tiene nada que ver con #include ni con el lenguaje en sí. Simplemente, los miembros del comité de ANSI para C++ decidieron cambiar el nombre de aquellos ficheros de cabecera que pertenecen a las bibliotecas estándares de ANSI C++. El cambio del nombre no es más que eliminar la extensión ".h". En el caso de aquellos ficheros estándares de cabecera que provienen de ANSI C, también se realiza el mismo cambio, pero además se agrega el prefijo 'c', para indicar que originaron de ANSI C.


Espero haber aclarado las dudas.

Steven


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