La pregunta no es "por qué no puedo inicializar una variable declarada como externa" , porque es algo completamente posible con variables de alcance de archivo (no con variables de alcance de bloque). La cuestión es que GCC produce una advertencia (con el interruptor -Wall) en este caso particular:

extern int n = 10;  // file scope declaration

GCC rinde:

test.c:5:12: warning: ‘n’ initialized and declared ‘extern’

Sin embargo, el código funciona perfectamente.

Además, tenga en cuenta que la siguiente definición es absolutamente equivalente a la primera:

int n = 10;  // file scope declaration

En ambos casos, la variable tiene el mismo tipo de vinculación y almacenamiento. El caso es que, siendo ambos absolutamente equivalentes, la segunda versión no produce ninguna advertencia en GCC (con -Wall).

¿Por qué?

Supongo que usualmente usas extern para establecer explícitamente un recordatorio sobre el hecho de que esta es una declaración que se refiere a un objeto externo definido en otro lugar, por lo que no debes (aunque podrías) inicializar la variable (bear Teniendo en cuenta que el estándar no te permite definir una variable dos veces dentro del mismo enlace, en este caso, externa).

Entonces, ¿es una suposición correcta, o quizás hay más, que no puedo ver?

c gcc
1
Pep 27 ago. 2020 a las 15:35

2 respuestas

La mejor respuesta

Un compilador puede advertir sobre cualquier cosa que le guste. Si está atento, advierte sobre cosas que considera como "sospechosas".

Así sucede aquí.

Mi opinión personal sobre el razonamiento coincide con la suya:

Supongo que usualmente usas extern para establecer explícitamente un recordatorio sobre el hecho de que esta es una declaración que se refiere a un objeto externo definido en otro lugar, por lo que no debes (aunque podrías) inicializar la variable (bear Teniendo en cuenta que el estándar no te permite definir una variable dos veces dentro del mismo enlace, en este caso, externa).

Que a GCC le parece sospechoso inicializar una variable declarada extern explícita porque generalmente es más común definir la variable que en otro archivo que puede depender del contexto causar un error al vincular y, de hecho, puede ser la razón, pero nuestras suposiciones no valen mucho.

La pregunta del verdadero "por qué" debe preguntar a los implementadores de GCC.

2
RobertS supports Monica Cellio 27 ago. 2020 a las 13:46

La palabra clave extern se usa para declarar una variable pero no para definirla (similar a las declaraciones de funciones). Por lo general, se usa en archivos de encabezado para exportar una variable desde un módulo. Sin embargo, a menudo es mejor introducir una función que devuelva su valor.

Ejemplo:

M.h

extern int M_n;

M.c

int M_n = 10;
-1
August Karlstrom 27 ago. 2020 a las 13:32