Tokens válidos de pré-processador na concatenação de macro

Tentei entender as macros em c usando o operador de pré-processador de concatenação ##, mas percebi que tenho problemas com tokens. Eu pensei que era fácil, mas na prática não é.

Portanto, a concatenação é para concatenar dois tokens para criar um novo token. ex: concatenação( e) ouint e*

eu tentei

#define foo(x,y) x ## y
foo(x,y)

sempre que dou alguns argumentos, sempre recebo erros ao dizer quepasting both argument does not give a valid preprocessor token.

Por exemplo, por que concatenarfoo(1,aa) resulta em1aa (que tipo de token é esse? e porque é válido) masfoo(int,*) Eu recebi um erro.

Existe uma maneira de saber quais tokens são válidos ou é possível ter um bom link para entender como posso esclarecer isso em minha mente. (Eu já pesquisei no google e no SO)

O que estou perdendo ?

Eu serei grato.

questionAnswers(3)

yourAnswerToTheQuestion