statement y definición

Aún se confunde con la statement y la definición en el término de C: si un archivo de encabezado es como:

#ifndef _BASIC_H_ #define _BASIC_H_ void test(); extern int i; //define or declare #endif 

y dos archivos de origen f1.c y f2.c contienen este encabezado, entonces un archivo de origen necesita definir la variable “i”.

pero si el archivo de cabecera es como:

 #ifndef _BASIC_H_ #define _BASIC_H_ void test(); int i; //define or declare #endif 

y dos archivos de origen f1.c y f2.c, contienen este encabezado sin definir la variable “i” en ningún archivo, todavía pasa cuando uso la variable.
Mis preguntas es cuando se define la variable.

Gracias

Definir una variable es cuando asigna memoria para el almacenamiento y tal vez le asigna un valor. La statement es cuando se establece que existe una variable con un nombre y tipo específicos, pero la memoria ya se ha asignado para ella.

El uso de la palabra clave extern significa que está declarando la variable pero no la está definiendo.

En términos de su pregunta específica, su primer ejemplo se está declarando y su segunda respuesta se está definiendo.

Para las variables automáticas y de registro, no hay diferencia entre definición y statement. El proceso de declarar una variable automática o de registro define el nombre de la variable y asigna la memoria apropiada.

Sin embargo, para variables externas: debido a que la memoria para una variable debe asignarse solo una vez, para garantizar que el acceso a la variable siempre se refiera a la misma celda. Todas las variables deben definirse una vez y solo una vez.

Si se va a usar una variable externa en un archivo diferente al que está definido, se necesita un mecanismo para “conectar” dicho uso con la celda de variable externa definida de forma única que se le asigna. Este proceso de conectar las referencias de la misma variable externa en diferentes archivos, se denomina resolución de las referencias.

Puede definirse y declararse con una statement de statement fuera de cualquier función, sin especificador de clase de almacenamiento. Dicha statement asigna memoria para la variable. También se puede utilizar una statement de statement para declarar simplemente un nombre de variable con el especificador de clase de almacenamiento externo al principio de la statement. Dicha statement especifica que la variable se define en otro lugar, es decir, la memoria para esta variable se asigna en otro archivo. Por lo tanto, el acceso a una variable externa en un archivo diferente al que está definido es posible si se declara con la palabra clave extern; no se asigna nueva memoria. Dicha statement le dice al comstackdor que la variable está definida en otro lugar, y el código se comstack con la variable externa que queda sin resolver. La referencia a la variable externa se resuelve durante el proceso de vinculación.

 Ex. Code: //file1.c extern char stack[10]; extern int stkptr; .... //file2.c char stack[10]; int stkptr; .... 

Estas declaraciones le dicen al comstackdor que las variables stack [] y stkptr están definidas en otro lugar, generalmente en algún otro archivo. Si se omitiera la palabra clave extern, las variables se considerarían nuevas y la memoria se asignaría para ellas. Recuerde, el acceso a la misma variable externa definida en otro archivo solo es posible si se utiliza la palabra clave extern en la statement.