¡Nuevo!  por fin disponible la versión 5 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