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 del valor de la variable. Afortunadamente, C Estándar incluye el operador de conversión a cadena (stringize) #, que ya se usó antes en este mismo capítulo. Cuando se coloca un # antes de un argumento en una macro del preprocesador, el preprocesador convierte ese argumento en una cadena. Esto, combinado con el hecho de que las cadenas sin signos de puntuación entre ellas se concatenan en una sola cadena, 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 convertida en cadena 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 ésta 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.