error: la declaración externa de ‘i’ sigue a la declaración sin vinculación

4 minutos de lectura

En el siguiente programa, pensé que extern int i; cambiará lo siguiente i para referirse a la i definido fuera main:

#include <stdio.h>

extern int i=1; // warning: 'i' initialized and declared 'extern'

int main()
{
    int i=2;
    printf("%d\n", i);
    extern int i; // error: extern declaration of 'i' follows declaration with no linkage
    printf("%d\n", i);
    return 0;
}

¿Cuál es el motivo del “error: la declaración externa de ‘i’ sigue a una declaración sin vinculación”, donde “declaración sin vinculación” se refiere a int i=2;?

Después de quitar int i=2 en main,

  • el error se ha ido,
  • la advertencia “advertencia: ‘i’ inicializado y declarado ‘externo'” en extern int i=1; también desaparecer. ¿Porqué es eso?

¡Gracias por las explicaciones!

  • error en extern int i; : identificadores duplicados en el mismo ámbito. Tratar { extern int i; printf("%d\n", i); }

    – PIXY AZUL

    16 de agosto de 2017 a las 23:28


  • reemplazar int externo i=1; con int i=1;

    – Ihdina

    16 de agosto de 2017 a las 23:34


  • Ya tienes una variable local i en el main(); no se puede llegar a la global. Las variables locales ocultan las globales. Esto no es C ++ donde tiene el operador de resolución de alcance para ayudar. Y es una mala práctica sombrear las variables globales (GCC le advertirá si especifica -Wshadow). Y es una práctica peor querer acceder a ambos en una sola función.

    –Jonathan Leffler

    16 de agosto de 2017 a las 23:38


  • @JonathanLeffler Es bueno saber que es una mala práctica. Mi ejemplo es más para estudiar el alcance y el propósito del enlace.

    usuario3284469

    17 de agosto de 2017 a las 0:08


error la declaracion externa de i sigue a la declaracion
Ihdina

#include <stdio.h>

int i=1;  // external variable

int main()
{
    int i=2;            // local variable
    printf("%d\n", i);  // print local variable i==2

    {
    extern int i;       // point to external variable
    printf("%d\n", i);  // print external variable i==1
    }

    return 0;
}

  • @JonathanLeffler, sí, me falta el enlace del alcance del bloque. Ahora funciona.

    – Ihdina

    16 de agosto de 2017 a las 23:49


Una vez que define una variable llamada i dentro de tu main función, la i en el alcance del archivo está enmascarado y no se puede acceder a él (a menos que tenga su dirección).

Cuando luego agregue la declaración extern int iesto entra en conflicto con la variable local llamada i en el mismo ámbito ya que los locales no pueden tener vinculación externa. Lo hace no darle acceso a la global i.

Cuando quitas el local ilos extern int i La declaración coincide con la definición en el ámbito del archivo, por lo que no hay ningún error. En cuanto a la advertencia sobre extern int i=1;eso hizo no vete para mí en gcc 4.1.2, así que eso depende del compilador.

  • Re “locals can’t have external linkage”: la vinculación es una propiedad de los identificadores, y los identificadores en el alcance del bloque ciertamente pueden tener una vinculación externa. La razón int i=2; extern int i; tiene un conflicto es C 2018 (y 2011 y anteriores) 6.7 3 da la restricción de que, si un identificador no tiene vinculación (que el i en int i-2; satisface), no debe haber más de una declaración del mismo en el mismo ámbito y espacio de nombres, con ciertas excepciones para nombres y etiquetas typedef.

    –Eric Postpischil

    9 de febrero de 2021 a las 22:12


Pregunta: ¿Cuál es el motivo del “error: la declaración externa de ‘i’ sigue a la declaración sin vinculación”, donde “declaración sin vinculación” se refiere a int i=2;?

Respuesta: No necesitamos usar el externo palabra clave aquí en la línea 3 cuando es un solo archivo en un programa y no hay otro archivo en el mismo programa u otra ubicación en el mismo archivo donde la variable ent yo tiene su definición. Hay dos razones principales por las que podemos usar externo palabra clave en C:
1. Cuando queremos declarar una variable de forma explícita/global pero sin su definición.
2. Para hacer que la variable sea visible globalmente desde cualquier otro archivo en un programa de varios archivos u otra ubicación del mismo archivo (consulte el ejemplo de Ihdina para este escenario).
Al compilar su código en mi sistema, aparece el siguiente error:
error: la declaración externa de ‘i’ sigue a la declaración no externa . lo cual tiene mucho sentido que el compilador detecte el externo en la línea 9 como una declaración duplicada de la misma variable ent yo en la línea 7.

Pregunta: Después de eliminar int i=2 en main, el error desaparece, la advertencia “advertencia: ‘i’ inicializado y declarado ‘extern'” en extern int i=1; también desaparecer. ¿Porqué es eso?

Respuesta: Después de quitar el inti=2; el error desapareció en mi sistema pero todavía tengo el siguiente mensaje de advertencia:
advertencia: la variable ‘externa’ tiene un inicializador [-Wextern-initializer]

Básicamente mi sistema (Apple LLVM versión 8.1.0 (clang-802.0.42)) no le gusta la inicialización explícita con externo palabra clave. Por lo tanto, debe modificar su código según la respuesta de Ihdina, que se compila sin errores.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad