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.