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.