Mensaje “aviso: declaración implícita de función”

4 minutos de lectura

Avatar de usuario de Angus
Angus

Mi compilador (GCC) me está dando la advertencia:

advertencia: declaración implícita de función

¿Por qué viene?

  • Un “por qué no da una versión de error”: stackoverflow.com/questions/434763/…

    – Ciro Santilli OurBigBook.com

    13 de mayo de 2015 a las 7:27


  • Esto también puede suceder si olvida incluir un archivo de encabezado. Por ejemplo, si está tratando de usar strlen() sin incluir string.h obtendrá este error

    – kurdtpage

    11 de septiembre de 2016 a las 8:21

avatar de usuario de cnicutar
cnicutar

Está utilizando una función para la cual el compilador no ha visto una declaración (“prototipo“) aún.

Por ejemplo:

int main()
{
    fun(2, "21"); /* The compiler has not seen the declaration. */       
    return 0;
}

int fun(int x, char *p)
{
    /* ... */
}

Debe declarar su función antes de main, así, ya sea directamente o en un encabezado:

int fun(int x, char *p);

  • Como complemento, si ha proporcionado el prototipo, compruebe que no es solo un error tipográfico. Además, si es de una biblioteca externa, verifique que lo haya incluido.

    – herir

    9 de diciembre de 2011 a las 3:53

  • No puedo ejecutar el código después de recibir esta advertencia. Entonces se comporta como un error.

    – Semblante

    21 de enero de 2014 a las 13:36

  • @Flimm, C99 y C89/C90 tiene una configuración diferente para esto

    – Cómo Chen

    15 de enero de 2015 a las 6:06


  • @Flimm stackoverflow.com/questions/434763/…

    – Ciro Santilli OurBigBook.com

    13 de mayo de 2015 a las 7:29

  • @ZachSaw Con razón. De lo contrario, no te habrías repetido tres veces.

    – Nima Mousavi

    8 dic 2019 a las 20:02

Avatar de usuario de Faizal Pribadi
faizal pribadi

La forma correcta es declarar prototipo de función en el encabezado.

Ejemplo

principal.h

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

C Principal

#include "main.h"

int main()
{
    some_main("Hello, World\n");
}

int some_main(const char *name)
{
    printf("%s", name);
}

Alternativa con un archivo (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}

Cuando haga sus #includes en main.c, coloque la referencia #include al archivo que contiene la función a la que se hace referencia en la parte superior de la lista de inclusión. por ejemplo, digamos que esto es main.c y su función a la que se hace referencia está en “SSD1306_LCD.h”

#include "SSD1306_LCD.h"    
#include "system.h"        #include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"  // This has the 'BYTE' type definition

Lo anterior no generará el error de “declaración implícita de función”, pero a continuación lo hará:

#include "system.h"        
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <string.h>
#include <math.h>
#include <libpic30.h>       // http://microchip.wikidot.com/faq:74
#include <stdint.h>
#include <stdbool.h>
#include "GenericTypeDefs.h"     // This has the 'BYTE' type definition
#include "SSD1306_LCD.h"    

Exactamente la misma lista #include, solo un orden diferente.

Bueno, lo hizo por mí.

Debe declarar la función deseada antes de su principal función:

#include <stdio.h>
int yourfunc(void);

int main(void) {

   yourfunc();
 }

Cuando obtienes el error: implicit declaration of function también debe enumerar la función infractora. A menudo, este error ocurre debido a un archivo de encabezado olvidado o faltante, por lo que en el indicador de shell puede escribir man 2 functionname y mira el SYNOPSIS en la parte superior, ya que esta sección enumerará los archivos de encabezado que deben incluirse. O tratar http://linux.die.net/man/ Estas son las páginas del manual en línea que tienen hipervínculos y son fáciles de buscar. Las funciones a menudo se definen en los archivos de encabezado, e incluir cualquier archivo de encabezado requerido suele ser la respuesta. Como dijo cnicutar,

Está utilizando una función para la cual el compilador aún no ha visto una declaración (“prototipo”).

Si tiene los encabezados correctos definidos y está utilizando un no GlibC biblioteca (como Musulmana C) gcc también tirará error: implicit declaration of function cuando las extensiones GNU como malloc_trim se encuentran.

La solución es envuelve la extensión y el encabezado:

#if defined (__GLIBC__)
  malloc_trim(0);
#endif

Avatar de usuario de Peter Mortensen
Pedro Mortensen

No olvide que si se llama a alguna función en su función, sus prototipos deben estar situados encima de su función en el código. De lo contrario, es posible que el compilador no los encuentre antes de intentar compilar su función. Esto generará el error en cuestión.

  • ¿Esto agrega algo que las otras respuestas ya no proporcionan?

    – Adrián Mole

    15 de diciembre de 2020 a las 13:33

¿Ha sido útil esta solución?