2008-12-18 8 views
6

Para aprender y demostrar, necesito una macro que imprima su parámetro y lo evalúa. Sospecho que es un caso muy común, incluso puede ser una pregunta frecuente, pero no puedo encontrar referencias reales.Macro que imprime una expresión y la evalúa (con __STRING)

Mi código actual es:

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", __STRING(expr), (expr))) 

y luego:

PRINT(x & 0x01); 

Funciona bien, pero no estoy seguro de la situación jurídica de la macro __STRING, especialmente ya que es en el sector privado __ espacio de nombres.

lo tanto, mi pregunta:

  1. ¿Hay una mejor manera de escribir esta macro?
  2. Está __STRING estándar/grande/el mal?
  3. cómo utilizar las herramientas de búsqueda existentes para encontrar sobre __STRING? Es tan motor de búsqueda solo busca cualquier cosa que contenga la cadena :-(
+0

he tenido problemas similares que buscan en el pasado. ".net" solía ser uno grande. – aib

+1

Puede usar Google para buscar Stackoverflow mediante el uso del sitio de Google: por ejemplo, el argumento :) "__string site: stackoverflow.com" (que no devolvió nada). – codelogic

Respuesta

10

Puede utilizar el símbolo # preprocesador que convierte su argumento RHS a una cadena literal:

#include <stdlib.h> 
#include <stdio.h> 

#define STR(x) #x 
#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", STR(expr), (expr))) 

int main(void) 
{ 
    int x = 7; 

    PRINT(x & 0x01); 

    return EXIT_SUCCESS; 
} 

2) Es, definitivamente, no es estándar, y esto es la primera vez que lo encuentro; no es sorprendente, ya que no parece hacer mucho más que la macro STR() anterior, a primera vista.

3) Google parece funcionar bien.

+0

De hecho, solo usar #expr en la definición de macro funciona bien. Pero, entonces, ¿cuál es el objetivo de la macro __STRING que encuentras en muchos lugares (como el código fuente assert)? – bortzmeyer

+0

__STRING es solo una envoltura alrededor de #. Está definido en cdefs.h – codelogic

12

Algo así como

#define PRINT(expr) (fprintf(stdout, "%s -> %d\n", #expr, (expr))) 

es probablemente lo que quiere. # es el operador de stringification.

Cuestiones relacionadas