2010-01-08 46 views
7

Tengo un programa C a continuación:¿Qué significa ## para el preprocesador C (C++)?

#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

cuando corro sólo el preprocesador se expande esto como

{ 
int var12=100; 
printf("%d",var12); 
} 

que es la razón por la que la salida es 100.

Puede Alguien dime cómo/por qué el preprocesador se expande var##12 to var12?

+6

Porque eso es lo que '##' significa en el preprocesador C. Es como decir "¿por qué' i ++ 'incrementa 'i'?". ¡Porque el estándar C lo dice! –

+0

-1 claramente tarea. – richo

+2

@Richo ... no es un trabajo a domicilio. Como no estoy muy familiarizado con el preprocesador, tenía esta pregunta en mente. Podría ser fácil para ti y podría parecer una tarea. Pero para los que sí la necesitan. No sé que esto no es tan fácil de entender. – Vijay

Respuesta

4

porque ## es un operador de concatenación token para el preprocesador C.

O tal vez no entiendo la pregunta.

+1

Concatena tokens, no cadenas. –

3

## es Token Pasting Operator

El doble número-signo o el operador "token-pegar" (##), que a veces se llama la "fusión" operador, se utiliza tanto en objeto similar y la función como macros. Permite que tokens separados se unan en un único token y, por lo tanto, no pueden ser el token primero ni el último en la definición de macro.

Si un parámetro formal en una definición de macro está precedido o seguido por el operador de pegar token, el parámetro formal se reemplaza inmediatamente por el argumento real no expandido. La expansión de macro no se realiza en el argumento antes del reemplazo.

1

#define f(g,g2) g##g2

## se usued para concatenar dos macros en c-preprocesador. Entonces, antes de compilar, f (var, 12) debe reemplazarse por el preprocesador con var12 y, por lo tanto, tiene la salida.