tags:

views:

346

answers:

2

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 :-(
+4  A: 

You can use the # preprocessor token which converts its RHS argument 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;
}

2) 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.

3) Google seems to work fine.

aib
Indeed, just using #expr in the macro definition works fine. But, then what's the point of the __STRING macro that you find in many places (such as assert() source code)?
bortzmeyer
__STRING is just a wrapper around #. It's defined in cdefs.h
codelogic
+4  A: 

Something like

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

is probably what you want. # is the stringification operator.

codelogic