c++ - signos - ¿Qué significa && mean in void*p=&& abc;
signos de programacion c++ (2)
Encontré una pieza de código void *p = &&abc;
. ¿Cuál es el significado de &&
aquí? Sé acerca de las referencias de valores, pero creo que &&
usado en este contexto es diferente. ¿Qué significa &&
indicar en void *p = &&abc;
?
Cómo encontrarlo
Esa es la dirección de una etiqueta y es una característica específica de GCC .
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p/n", startp);
return 0;
}
Podrías haberlo averiguado probando:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p/n", startp);
return 0;
}
En ese caso, GCC dice:
error: etiqueta ''a'' usada pero no definida
Debajo del capó - ensamblaje
Necesitas saber ensamblador para entender esto realmente, pero trataré de explicarte lo que significa una dirección de una etiqueta.
Después de que el SO cargue el archivo .exe del disco, un componente del sistema operativo llamado "el cargador" (Windows tiene el "cargador PE", Linux tiene "cargador ELF" o incluso otros, si están compilados en el kernel), realiza una "virtualización" de ese programa, convirtiéndolo en un proceso.
Este proceso piensa que es el único en la RAM y tiene acceso a toda la memoria RAM (es decir, 0x00000000-0xFFFFFFFF en una máquina de 32 bits).
(Lo anterior es solo una breve descripción de lo que está sucediendo, realmente necesitas aprender a ensamblar para entenderlo completamente, así que ten paciencia conmigo)
Ahora, la etiqueta en un código fuente es básicamente una dirección. "etiqueta ir"; no hace más que un salto a esa dirección (piense en el puntero de instrucción en el ensamblaje). Esta etiqueta almacena esta dirección de RAM, y así es como puede averiguar esa dirección.
Después de haber aprendido ASM, se dará cuenta de que esa dirección apunta a una instrucción dentro de la sección .text
del ejecutable. La sección .text
es la que contiene el código del programa (binario) que se ejecutará.
Puedes inspeccionar esto con:
objdump -x a.out
Un ejemplo práctico
Como se describe en GCC , puede usar esto para inicializar una tabla de salto. Algunos generadores de escáner como re2c (consulte el parámetro -g
) lo utilizan para generar escáneres más compactos. Tal vez incluso hay un generador de analizadores que emplea la misma técnica.
&&
es la extensión de gcc para obtener la dirección de la etiqueta definida en la función actual.
void *p = &&abc
es ilegal en C99 y C ++ estándar.
This compila con g ++.