Вы можете использовать токен препроцессора #, который преобразует свой аргумент RHS в строковый литерал:
#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) Это определенно не стандартно, и я впервые сталкиваюсь с этим; это неудивительно, поскольку на первый взгляд кажется, что он не выполняет намного больше, чем макрос STR (), приведенный выше.
3) Google вроде бы нормально работает.