3.9.2. Convertir variables y expresiones en cadenas

Cuando se escribe código de depuración, resulta pesado escribir expresiones print que consisten en una cadena que contiene el nombre de una variable, seguido de el valor de la variable. Afortunadamente, el C estándar incluye el operador de FIXME cadenización #, que ya se usó antes en este mismo capítulo. Cuando se coloca un # antes de una argumentos en una macro, el preprocesador convierte ese argumentos en una cadena. Esto, combinado con el hecho de que las cadenas no indexadas colocadas una a continuación de la otra se concatenan, permite crear macros muy adecuadas para imprimir los valores de las variables durante la depuración:

#define PR(x) cout << #x " = " << x << "\n";

Si se imprime la variable a invocando PR(a), tendrá el mismo efecto que este código:

cout << "a = " << a << "\n";

Este mismo proceso funciona con expresiones completas. El siguiente programa usa una macro para crear un atajo que imprime la expresión cadenizadas y después evalúa la expresión e imprime el resultado:

//: C03:StringizingExpressions.cpp
#include <iostream>
using namespace std;

#define P(A) cout << #A << ": " << (A) << endl;

int main() {
  int a = 1, b = 2, c = 3;
  P(a); P(b); P(c);
  P(a + b);
  P((c - a)/b);
} ///:~

Listado 3.63. C03/StringizingExpressions.cpp


Puede comprobar cómo una técnica como esta se puede convertir rápidamente en algo indispensable, especialmente si no tiene depurador (o debe usar múltiples entornos de desarrollo). También puede insertar un #ifdef para conseguir que P(A) se defina como «nada» cuando quiera eliminar el código de depuración.