Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


Ejemplo de token adhesivo en directiva #define

A continuación se muestra un posible ejemplo de uso de la doble almohadilla ## ("token paste") en el que se utiliza como una nueva forma de notación para las matrices.

#include <iostream>
using namespace std;

#define MATRIZ(M, F, C) M[F]##[C]

int MATRIZ(diasN, 4, 3) = {{31,28,31},{30,31,30},{31,31,30},{31,30,31}};
int MATRIZ(diasB, 4, 3) = {{31,29,31},{30,31,30},{31,31,30},{31,30,31}};

const char* MATRIZ(meses, 4, 3) = {
    {"Enero","Febrero","Marzo"},
    {"Abril","Mayo","Junio"},
    {"Julio","Agosto","Septiembre"},
    {"Octubre","Noviembre","Diciembre"} };

int main() {    // ========
   int trim = 1;
   int mes = 2;

   cout << "El mes " << mes << " del trimestre " << trim << " es "
        << MATRIZ(meses , trim-1, mes-1) << endl;
   cout << "En a;os normales tiene " << MATRIZ(diasN, trim-1, mes-1) << " dias" << endl;
   cout << "En a;os bisiestos tiene " << MATRIZ(diasB, trim-1, mes-1) << " dias" << endl;
}

Salida:

El mes 2 del trimestre 1 es Febrero
En a;os normales tiene 28 dias
En a;os bisiestos tiene 29 dias

Comentario

El funcionamiento se comprende perfectamente si consideramos el código resultante de la directiva

#define MATRIZ(M, F, C) M[F]##[C]

sobre el código propuesto, después del paso del preprocesador [1]:

#include <iostream>
using namespace std;

int diasN[4][3] = {{31,28,31},{30,31,30},{31,31,30},{31,30,31}};
int diasB[4][3] = {{31,29,31},{30,31,30},{31,31,30},{31,30,31}};

const char* meses[4][3] = {
   {"Enero","Febrero","Marzo"},
   {"Abril","Mayo","Junio"},
   {"Julio","Agosto","Septiembre"},
   {"Octubre","Noviembre","Diciembre"} };

int main() {    // ==========
  int trim = 1;
  int mes = 2;

  cout << "El mes " << mes << " del trimestre " << trim << " es "
       << meses[trim-1][mes-1] << endl;
  cout << "En a;os normales tiene " << diasN[trim-1][mes-1] << " dias" << endl;
  cout << "En a;os bisiestos tiene " << diasB[trim-1][mes-1] << " dias << endl;
}


  Inicio.


[1] En el compilador Borland C++ 5.5, el código propuesto compila sin dificultad.  Sin embargo, el compilador GNU G++ 3.4.2-20040916-1, que acompaña a Dev-C++ 4.9.9.2, produce un error en la fase de preprocesado:

9:1 D:\xxxx.cpp pasting "]" and "[" does not give a valid preprocessing token