La Red de Conocimientos Pedagógicos - Currículum vitae - ¿Qué significa _##nombre en lenguaje C?

¿Qué significa _##nombre en lenguaje C?

## El símbolo de conexión consta de dos signos de almohadilla. Su función es conectar dos subcadenas (tokens) en una definición de macro con parámetros para formar una nueva subcadena. Pero no puede ser la primera ni la última subcadena. La llamada subcadena (token) se refiere a la unidad de sintaxis más pequeña que el compilador puede reconocer.

En pocas palabras, "##" es un método de conexión separada. Su función es separar primero y luego forzar la conexión. Entre ellos, la función de separación es similar a la de los espacios. Sabemos que en las definiciones de macros ordinarias, el preprocesador generalmente interpreta los espacios como indicadores de segmento, compara cada segmento con el anterior y reemplaza los mismos. Pero el resultado de esto es que quedan algunos espacios entre los segmentos reemplazados. Si no queremos que aparezcan estos espacios, podemos reemplazarlos agregando algunos ##.

Por ejemplo, intente comparar las diferencias entre las siguientes definiciones de macros

#define A1(nombre, tipo) escriba nombre_##tipo##_tipo o

#definir A2(nombre, tipo) tipo nombre##_##tipo##_tipo

A1(a1, int

A2(a1, int); p>

p>

Explicación:

1) En la primera definición de macro, entre "nombre" y el primer "_", y entre el segundo "_" y el segundo "tipo " " no están separados, por lo que el preprocesador interpretará nombre_##tipo##_tipo en tres segmentos: "nombre_", "tipo" y "_tipo". Sólo "tipo" aparece delante de la macro.

para que pueda ser reemplazado por una macro.

2) En la segunda definición de macro, "nombre" y el primer "_" también están separados, por lo que el preprocesador cambiará el nombre##_##tipo## _tipo se interpreta en cuatro segmentos: " nombre", "_", "tipo" y "_tipo", de los cuales dos pueden ser reemplazados por macros.

3) A1 y A2 también se pueden definir de la siguiente manera:

#define A1(nombre, tipo) tipo nombre_ ##tipo ##_tipo

< # #Agregue algunos espacios delante a voluntad>

#defina A2(nombre, tipo) escriba el nombre ##_ ##tipo ##_tipo

El resultado es ## reemplazará los espacios anteriores Elimine la conexión fuerte y obtenga la misma definición de macro que el resultado anterior.

U otro ejemplo

#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(nombre,empresa,posición,salario);

// Esta declaración se ampliará a:

// typedef struct _record_type nombre_empresa_posición_salario;

Para un uso detallado, consulte el siguiente contenido del blog: /s/blog_7d9463b20100xp5t.html