2011-07-06 20 views
16

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.

+3

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

Respuesta

20

Los ## en # ## # actúa como una secuencia de escape en esta expresión. Concatena el extremo izquierdo y el derecho # para finalmente producir el token ##. Simplemente definir la macro como ## provocaría un error ya que el operador de concatenación espera dos operandos.

+1

¿Cómo decidir que '' # ## # significa '' ## y 'no "##" 'seguido de un error de sintaxis (porque el '' 'restante no tiene un operando derecho)? - ¿'## 'tiene precedencia sobre' # '? –