2008-12-18 4 views
6

Pour l'apprentissage et la démonstration, j'ai besoin d'une macro qui imprime son paramètre et l'évalue. Je suspecte que c'est un cas très commun, peut-être même une FAQ mais je ne peux pas trouver des références réelles.Macro qui imprime une expression et l'évalue (avec __STRING)

Mon code actuel est:

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

puis:

PRINT(x & 0x01); 

Il fonctionne très bien, mais je ne suis pas sûr du statut juridique de la macro __STRING, en particulier car il est dans le secteur privé __ espace de noms.

Alors, mes questions:

  1. Y at-il une meilleure façon d'écrire cette macro?
  2. Est-ce que __STRING standard/great/evil?
  3. Comment utiliser les outils de recherche existants pour trouver au sujet __STRING? Le moteur de recherche de SO recherche simplement tout ce qui contient la chaîne :-(
+0

J'ai déjà rencontré des problèmes similaires dans le passé. ".net" était un grand. – aib

+1

Vous pouvez utiliser google pour rechercher StackOverflow en utilisant le site de google: argument :) e.g. "__string site: stackoverflow.com" (qui n'a rien retourné). – codelogic

Répondre

10

Vous pouvez utiliser le jeton # préprocesseur qui convertit son argument RHS à une chaîne littérale:

#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) Il est certainement pas standard, et ce c'est la première fois que je l'ai rencontré; pas surprenant car il ne semble pas faire beaucoup plus que la macro STR() ci-dessus, à première vue.

3) Google semble fonctionner très bien.

+0

En effet, juste en utilisant #expr dans la définition de la macro fonctionne très bien. Mais, alors, quel est le point de la macro __STRING que vous trouvez dans de nombreux endroits (comme le code source assert())? – bortzmeyer

+0

__STRING est juste une enveloppe autour de #. C'est défini dans cdefs.h – codelogic

12

Quelque chose comme

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

est probablement ce que vous voulez. # est l'opérateur de stringification.

Questions connexes