#include <stdio.h>

#define CAT_(x, ...) x ## __VA_ARGS__
#define CAT(...) CAT(__VA_ARGS__)

#define CHECK_N(x, n, ...) n
#define CHECK(...) CHECK_N(__VA_ARGS__, 0)
#define PROBE(x) x, 1

#define IS_CHAR(t) CHECK(CAT_(IS_CHAR_, t(~,1)))
#define IS_CHAR_char(...) __VA_ARGS__

#define QUOTE_(...) #__VA_ARGS__
#define QUOTE(...) QUOTE_(__VA_ARGS__)

#define PRINT(...) puts(QUOTE_(__VA_ARGS__))

int main(void)
{
    PRINT(IS_CHAR(char), IS_CHAR(int), IS_CHAR(char**), IS_CHAR(char(*)()));
    return 0;
}
