Declaración Versus Definición en C

Recientemente, mientras aprendía sobre progtwigción en C, noté algo que me pareció interesante. Había leído que una statement como int i=0; es la única forma de forzar una definición mientras que una statement como extern int i; Implica una statement forzada. Una statement como int i; sería dependiente del contexto. Pero, ¿qué sucede cuando combino el extern con la inicialización como extern int i=13; . El comstackdor genera una advertencia. Pero, ¿qué es esta regla que gobierna esto?

Esta es una advertencia de estilo de encoding .
El argumento para esto es que el código es válido, pero en general es unidiomático para C, ya que generalmente se espera que “extern” signifique que la statement no proporciona una definición del objeto.

 extern int i=13; 

declara y define i , mientras que:

 extern int i; 

simplemente declara la variable i .

Un error específico 45977 se ha generado en GCC en el mismo, pero aún se muestra el estado de no confirmado.

El informe de error señala que el código es sintáctico según el estándar C. Y tiene una discusión que discute esto en detalle.


Para los aficionados Standerdese:
Las referencias relevantes de la sección son:
ansi c99 estándar 6.2.2: vinculación de identificadores y
ansi c99 estándar 6.9.2.4

Cuando declaras una variable solo le asignas un nombre.

Al definir una variable se reserva memoria para ella.

Cuando declara una variable como externa le está diciendo al comstackdor “esto está definido en otro lugar y estará disponible en el tiempo de enlace”, por lo que está bien usarlo.

Extern se usa si desea acceder a una variable particular desde un progtwig diferente. Como no tiene ninguna definición para eso, en su progtwig su comstackdor le está dando un error.

En C, una definición es solo una statement que sucede para asignar almacenamiento (ya sea porque tiene un inicializador o porque es una definición provisional que se usa como una definición). Por lo tanto, todo lo que puede hacer con una statement (como especificar que tiene almacenamiento extern ), también lo puede hacer con una definición.

Tenga en cuenta que esto difiere de C ++.