C preprocesador # y ## operadores
Los Documento estándar C99 tiene el siguiente ejemplo en la sección relacionada con el operador de preprocesamiento ##:
En el siguiente fragmento:
#define hash_hash # ## #
#define mkstr(a) # a
#define in_between(a) mkstr(a)
#define join(c, d) in_between(c hash_hash d)
char p[] = join(x, y); // equivalent to
// char p[] = "x ## y";
La expansión produce, en varias etapas:
join(x, y)
in_between(x hash_hash y)
in_between(x ## y)
mkstr(x ## y)
"x ## y"
n otras palabras, expandir hash_hash produce un nuevo token, que consta de dos signos afilados adyacentes, pero este nuevo token no es el operador ##.
No entiendo por qué la sustitución de hash_hash produce ## y no "##" o "#" "#". ¿Qué papel juegan los hash individuales antes y después del doble hash?
Cualquier respuesta es muy apreciada.