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
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.
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
faizal pribadi
La forma correcta es declarar prototipo de función en el encabezado.
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
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
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.
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