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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta