Да. Но это доступно только в C11.
#define FORMAT_OF(x) _Generic((x), \
int: "%d", \
unsigned: "%u", \
const char *: "%s", \
void *: "%p")
Для типов вместо значений вы можете попробовать _Generic((type) 0, ...
.
Ваш компилятор, вероятно, не поддерживает C11. В GCC 4.6 (но не в 4.5!) Включена поддержка C11 с -std=c1x
или -std=gnu1x
, но я не думаю, что _Generic
пока поддерживается.