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;
}
[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