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

4 minutos de lectura

avatar de usuario
Angus

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

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

Por favor, ayúdame a entender por qué viene.

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

    – Ciro Santilli Путлер Капут 六四事

    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
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 Путлер Капут 六四事

    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
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
}

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

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

int main(void) {

   yourfunc();
 }

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í.

No olvide, si alguna función que se llama en su función y 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

avatar de usuario
Dwayne

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”).

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

    – Adrián Mole

    15 de diciembre de 2020 a las 13:33

avatar de usuario
Peter Vois

Creo que la pregunta no está 100% respondida. Estaba buscando un problema con la falta de typeof (), que es la directiva de tiempo de compilación.

Los siguientes enlaces arrojarán luz sobre la situación:

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

a partir de la conclusión tratar de utilizar __typeof__() en cambio. También gcc ... -Dtypeof=__typeof__ ... poder ayudar.

¿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