2008-12-18 6 views
6

Zum Lernen und Demonstrieren benötige ich ein Makro, das seinen Parameter ausgibt und wertet es aus. Ich vermute, dass es ein sehr häufiger Fall ist, vielleicht sogar eine FAQ, aber ich kann keine wirklichen Referenzen finden.Makro, das einen Ausdruck druckt und auswertet (mit __STRING)

Mein aktueller Code ist:

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

und dann:

PRINT(x & 0x01); 

Es funktioniert gut, aber ich bin von dem rechtlichen Status des __STRING Makro nicht sicher, speziell, da es in der privat __ Namespace.

Also, meine Fragen:

  1. Gibt es einen besseren Weg, um dieses Makro zu schreiben?
  2. Ist __STRING Standard/groß/böse?
  3. Wie können Sie mit vorhandenen Suchtools nach __STRING suchen? SO Suchmaschine durchsucht nur etwas String mit :-(
+0

Ich hatte ähnliche Probleme in der Vergangenheit zu suchen. ".net" war früher ein großer. – aib

+1

Sie können Google verwenden, um StackOverflow zu durchsuchen, indem Sie das Argument site von Google verwenden: z. "__string site: stackoverflow.com" (die nichts zurückgegeben hat). – codelogic

Antwort

10

Sie das Token # Präprozessor verwenden kann, die seine wandelt RHS Argument einer Stringliteral:

#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 ist definitiv nicht Standard, und diese ist das erste Mal, dass ich darauf gestoßen bin; nicht überraschend, da es auf den ersten Blick nicht viel mehr als das obige Makro STR() zu tun scheint.

3) Google scheint gut zu funktionieren.

+0

In der Tat, nur mit # Ausdruck in der Makrodefinition funktioniert gut. Aber was ist der Sinn des Makros __STRING, das Sie an vielen Stellen finden (z. B. assert() - Quellcode)? – bortzmeyer

+0

__STRING ist nur ein Wrapper um #. Es ist in cdefs.h definiert – codelogic

12

So etwas wie

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

ist wahrscheinlich das, was Sie wollen. # ist der Stringifikationsoperator.