C – La función tiene enlace interno pero no está definida

2 minutos de lectura

avatar de usuario de th3g3ntl3man
th3g3ntl3man

Tengo esta estructura de carpetas:

estructura

Escribí una función simple para probar la estructura de carpetas, para ver si todos los archivos de encabezado pero cuando compilo con el comando make, tengo este error:

advertencia: la función ‘stampa’ tiene un enlace interno pero no está definida

yo el lagrange.h archivo tengo esto:

#ifndef LAGRANGE_H

static void stampa(int i);

#endif /* LAGRANGE_H */

y en el lagrange.c archivo tengo esto:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <stdio.h>

void stampa(int i){
    printf("%d", i);
}

al final, int main.c Simplemente llamo a la función stampa pasándoles un número.

  • Aparte: olvidaste poner #define LAGRANGE_H en lagrange.h

    – Veleta

    27/06/2018 a las 20:35

  • Quitar el static palabra clave de lagrange.h

    – usuario3386109

    27/06/2018 a las 20:40

  • Y es una buena práctica incluir el archivo de encabezado en el archivo .c correspondiente. Así que debería haber un #include "lagrange.h" en lagrange.c.

    – usuario3386109

    27 de junio de 2018 a las 20:43


  • static al definir una función significa “solo en este archivo fuente”. Si lo coloca en un encabezado, no tiene sentido o crea una nueva copia de la función en cada archivo que la incluye. No es algo que quieras.

    – Zan Lince

    27/06/2018 a las 20:51

Avatar de usuario de Laurent H.
laurent h.

Explicación del error:

El error de compilación ocurre porque:

  1. Ha declarado una función con static palabra clave (es decir, con enlace interno) dentro lagrange.h
  2. Y has incluido este archivo. lagrange.h en main.c archivo diferente de lagrange.cdonde la función no está definida.

Así que cuando el compilador compila main.c archivo, se encuentra con el static declaración sin ninguna definición asociada, y plantea lógicamente el error. El mensaje de error es explícito.

Solución:

En tu caso la solución es quitar el static palabra clave, porque static significa que la función solo se puede llamar en el archivo .c donde está definida, que no es su caso.
Además, una buena práctica puede ser declarar cualquier static función en el mismo archivo .c donde está definido, y no en el archivo .h.

  • No olvide que poner cosas en el espacio de nombres anónimo también hace que el archivo sea estático. p.ej, namespace { ... } solo es visible para esa unidad de traducción de código.

    – Jesse Chisholm

    22 de julio de 2019 a las 23:40

  • @JesseChisholm eso solo es relevante para C ++, pero el OP está hablando de C

    – Nimrod Dayán

    24/11/2021 a las 21:45

¿Ha sido útil esta solución?