Declaración de variable vs definición

Estaba leyendo alguna información sobre externos. Ahora el autor comenzó a mencionar statement y definición de variables. Por statement se refirió al caso cuando: si una variable se declara, el espacio para ella no se asigna. Ahora, esto me llevó a la confusión, porque creo que la mayoría de las veces cuando uso variables en C, en realidad las estoy definiendo y declarando ¿verdad? es decir,

int x; // definition + declaration(at least the space gets allocated for it) 

Creo que entonces solo los casos en C cuando declara la variable pero no la define es cuando usa:

 extern int x; // only declaration, no space allocated 

¿Lo entendí bien?

Básicamente, sí, tienes razón.

 extern int x; // declares x, without defining it extern int x = 42; // not frequent, declares AND defines it int x; // at block scope, declares and defines x int x = 42; // at file scope, declares and defines x int x; // at file scope, declares and "tentatively" defines x 

Como está escrito en el Estándar C, una statement especifica la interpretación y los atributos de un conjunto de identificadores y una definición para un objeto, hace que el almacenamiento se reserve para ese objeto . También una definición de un identificador es una statement para ese identificador .

Así es como lo veo juntando fragmentos y piezas que encontré en Internet. Mi vista podría estar torcida.
Algunos ejemplos básicos.

 int x; // The type specifer is int // Declarator x(identifier) defines an object of the type int // Declares and defines int x = 9; // Inatializer = 9 provides the initial value // Inatializes 

El estándar C11 6.7 establece que una definición de un identificador es una statement para ese identificador que:

– para un objeto, hace que el almacenamiento se reserve para ese objeto;

– para una función, incluye el cuerpo de la función;

 int main() // Declares. Main does not have a body and no storage is reserved int main(){ return 0; } // Declares and defines. Declarator main defines // an object of the type int only if the body is included. 

El siguiente ejemplo

 int test(); Will not compile. undefined reference to main int main(){} Will compile and output memory address. // int test(); int main(void) { // printf("test %p \n", &test); will not compile printf("main %p \n",&main); int (*ptr)() = main; printf("main %p \n",&main); return 0; } extern int a; // Declares only. extern int main(); //Declares only. extern int a = 9; // Declares and defines. extern int main(){}; //Declares and defines. . 

Durante la statement, una ubicación de memoria está reservada por el nombre de esa variable, pero durante la definición, el espacio de memoria también se asigna a esa variable.