Automático se refiere al concepto C de duración del almacenamiento automático . En C, hay principalmente 2 duraciones de almacenamiento diferentes para los objetos: static (no debe confundirse con la palabra clave static
, que es un especificador de clase de almacenamiento ) y automático . Un objeto conservará su último valor almacenado y se almacenará en una dirección constante durante toda su vida útil.
La duración del almacenamiento estático significa "la duración de todo el programa" , es decir, desde antes de ingresar main
la primera vez hasta después de salir de él.
La duración del almacenamiento automático es para los objetos "declarados sin vínculo y sin el especificador de clase de almacenamiento static
": el sin vínculo significa que no se declaran globalmente, se declaran / definido dentro de un bloque y no declarado con el especificador de clase de almacenamiento extern
. Su vida es principalmente hasta el final del bloque.
Ahora en tu programa,
#include <xc.h>
int main (void)
{
int __attribute__((address(0x3000))) x;
while(1);
return 0;
}
Dado que la definición-definición int x;
no tiene ni el extern
ni el static
especificador de la clase de almacenamiento , define un objeto int
de automático duración de almacenamiento dentro de la función main
. Cada vez que se ingresa la función main
, se debe asignar un objeto distinto nuevo . C permite que la función main
se llame a sí misma recursivamente, así que claramente x
simplemente no puede estar en una dirección fija aquí. De hecho, en muchas arquitecturas informáticas, x
puede que ni siquiera resida en la memoria, puede estar en un registro u optimizarse por completo.
Solo tiene sentido tener un objeto que tenga una duración de almacenamiento static , a diferencia de la duración del almacenamiento automático, para ubicarse en una dirección fija. Además de declarar esto en el archivo ámbito:
int __attribute__((address(0x3000))) x;
int main(void) { ... }
que haría que x
sea accesible en todas partes dentro del archivo, también puede hacer que el identificador sea privado a la función main
, pero aún así conservar la duración del almacenamiento estático , usando el static
especificador de clase de almacenamiento :
int main(void) {
static int __attribute__((address(0x3000))) x;
...
}
Ahora, el identificador x
no es visible fuera de la función main
; y solo se define exactamente un x
, y su duración de almacenamiento es estática, lo que significa que es para toda la duración del programa, ya que su duración de almacenamiento no es automática , pero tendrá un Dirección fija para todo el tiempo de ejecución del programa, se le puede pedir al compilador que la ubique en una dirección alternativa.