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.

Angus
fuente
1
Un "por qué no da una versión de error": stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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);
cnicutar
fuente
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
3
@Flimm stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
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
}
Faizal Pribadi
fuente
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.

tomc
fuente
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").

Dwayne
fuente
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
Stuart Cardall
fuente
1

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

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

int main(void) {

   yourfunc();
 }
Poussy
fuente