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


201

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.



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

Respuestas:


230

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

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, como esta, ya sea directamente o en un encabezado:

int fun(int x, char *p);

9
Además, si le ha dado al prototipo, compruebe que no es solo un error tipográfico. Además, si es de una biblioteca externa, verifique que la haya incluido.
smitec

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

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


1
@ZachSaw Con razón. De lo contrario, no te hubieras repetido tres veces.
Nima Mousavi

19

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

Ejemplo

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

7

Cuando realice sus #includes en main.c, coloque la referencia #include en el archivo que contiene la función referenciada en la parte superior de la lista de inclusión. por ejemplo, digamos que esto es main.c y su función referenciada 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 sí:

#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 mi.


3

Cuando obtenga el error: implicit declaration of functiontambié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 functionnamey mirar la SYNOPSISsección en la parte superior, ya que esta sección enumerará todos los archivos de encabezado que deben incluirse. O pruebe http://linux.die.net/man/. Estas son las páginas man en línea que tienen hipervínculos y son fáciles de buscar. Las funciones a menudo se definen en los archivos de encabezado, incluso cualquier archivo de encabezado requerido es a menudo la respuesta. Como dijo cnicutar:

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


2

Si tiene los encabezados correctos definidos y está utilizando una GlibCbiblioteca que no sea (como Musl C ) gcc, también se lanzará error: implicit declaration of functioncuando malloc_trimse encuentren extensiones GNU como .

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

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

1

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

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

int main(void) {

   yourfunc();
 }

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.