Search code examples
cexpression-evaluation

Macro which prints an expression and evaluates it (with __STRING)


For learning and demonstrating, I need a macro which prints its parameter and evaluates it. I suspect it is a very common case, may be even a FAQ but I cannot find actual references.

My current code is:

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

and then:

PRINT(x & 0x01);

It works fine but I am not sure of the legal status of the __STRING macro, specially since it is in the private __ namespace.

So, my questions:

  1. Is there a better way to write this macro?
  2. Is __STRING standard/great/evil?
  3. How to use existing search tools to find about __STRING? SO's search engine just searches anything containing string :-(

Solution

  • You can use the # preprocessor token which converts the parameter following it to a string 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;
    }
    
    1. It's definitely not standard, and this is the first time I've come across it; not surprising as it doesn't seem to do much more than the STR() macro above, at a first glance.

    2. Google seems to work fine.