55 - Directiva #define


La directiva #define especifica un nombre que será reemplazado por un cierto valor en todos los lugares del programa donde se haga referencia.

Se crean fuera de cualquier función o clase normalmente en la parte inicial del archivo. La sintaxis es la siguiente:

#define [nombre de la macro]  [valor de la macro]

Un ejemplo concreto es:

#define TAMANO 20
#define MENSAJEFIN “Presione una tecla para finalizar”

El nombre de la macro es común que se la escriba con caracteres mayúsculas (es una regla que utilizan muchos programadores pero no es obligatoria)

Luego de especificar el nombre de la macro hay uno o más espacios y debemos especificar el valor de la macro.

El primer paso del compilador es reemplazar todas las partes del programa donde hay declaradas macros por los valores de dichas macros.

El uso excesivo de macros puede tornar muy difícil el mantenimiento de programas.

Problema:

Definir tres macros y utilizarlas en distintas partes del programa.

Programa:

#include<iostream>

#define TAMANO 5
#define MENSAJEFIN "Presione una tecla para finalizar\n"
#define DETENER cin.get();cin.get();

using namespace std;

int main()
{
    int vec[TAMANO];
    for(int f=0;f<TAMANO;f++)
    {
        cout <<"Ingrese elemento:";
        cin >>vec[f];
    }
    for(int f=0;f<TAMANO;f++)
    {
        cout << vec[f] << "-";
    }
    cout <<"\n";
    cout <<MENSAJEFIN;
    DETENER
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace : Macros1.zip

Es importante entender que lo primero que hace el compilador es reemplazar todos los lugares donde se hace referencia a la macro por el valor de la misma, luego este programa lo que realmente se está compilando es:

#include<iostream>

using namespace std;

int main()
{
    int vec[5];
    for(int f=0;f<5;f++)
    {
        cout <<"Ingrese elemento:";
        cin >>vec[f];
    }
    for(int f=0;f<5;f++)
    {
        cout << vec[f] << "-";
    }
    cout <<"\n";
    cout <<"Presione una tecla para finalizar\n";
    cin.get();cin.get();
}

Es decir en el programa en ejecución no podemos hacer referencias a las macros como hacemos en las variables. Las macros en el programa final no ocupan espacio ya que son sustituidas por las valores asignados a las mismas en tiempo de compilación.

Problema propuesto

  1. Plantear una clase para administrar una matriz de enteros de 4 filas y 2 columnas. Definir dos macros para indicar la cantidad de filas y columnas.
Solución
#include <iostream>

#define FILAS 4
#define COLUMNAS 2

using namespace std;

class Matriz {
    int mat[FILAS][COLUMNAS];
public:
    void cargar();
    void imprimir();
};

void Matriz::cargar()
{
    for(int f=0;f<FILAS;f++)
    {
        for(int c=0;c<COLUMNAS;c++)
        {
            cout<<"Ingrese elemento de la fila "<< f << " columna:" << c << ":";
            cin >> mat[f][c];
        }
    }
}

void Matriz::imprimir()
{
    for(int f=0;f<FILAS;f++)
    {
        for(int c=0;c<COLUMNAS;c++)
        {
            cout << mat[f][c] << " ";
        }
        cout << "\n";
    }
}

int main()
{
    Matriz matriz1;
    matriz1.cargar();
    matriz1.imprimir();
    return 0;
}

Este proyecto lo puede descargar en un zip desde este enlace :Macros2.zip

Retornar