El C99 standard document tiene el siguiente ejemplo, en la sección relacionada con el operador ## de preprocesamiento:C preprocesador # y ## operadores
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 diversas etapas:
join(x, y) in_between(x hash_hash y) in_between(x ## y) mkstr(x ## y) "x ## y"
En otras palabras, la ampliación de hash_hash produce un nuevo token, que consiste en dos signos agudos adyacentes, pero esta nueva token no es el operador ##.
No entiendo por qué la sustitución de hash_hash produce ## y no "##" o "#" "#". ¿Qué papel tienen los hashes individuales antes y después del doble hash?
Cualquier respuesta apreciado considerablemente.
hashes individuales antes y después de ## son sólo caracteres, y ## (token) los harán en dos caracteres ## (no en token). después de aplicar un mkstr a ellos, ellos se convertirán en serie de "##" – osgx