Mi compilador (GCC) me está dando la advertencia:aviso: declaración implícita de la función
aviso: declaración implícita de la función
Por favor, me ayudan a entender por qué es que viene.
Mi compilador (GCC) me está dando la advertencia:aviso: declaración implícita de la función
aviso: declaración implícita de la función
Por favor, me ayudan a entender por qué es que viene.
Está utilizando una función para la cual el compilador no ha visto una declaración ("prototype") todavía.
Por ejemplo:
int main()
{
fun(2, "21"); /* The compiler has not seen the declaration. */
return 0;
}
int fun(int x, char *p)
{
/* ... */
}
Es necesario declarar su función antes de principal, por ejemplo, ya sea directamente o en un encabezado:
int fun(int x, char *p);
As una adición si le has dado al prototipo comprobar que no es solo un error tipográfico. Además, si es de una biblioteca externa, compruebe que la ha incluido. – smitec
¿Por qué es esto una advertencia y no un error? – Flimm
No puedo ejecutar el código después de recibir esta advertencia. Entonces se comporta como un error. – Mien
La forma correcta es declarar prototipo de función en la cabecera .
main.h
#ifndef MAIN_H
#define MAIN_H
int some_main(const char *name);
#endif
main.c
#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
}
Si tiene las cabeceras correctas definidas & están utilizando una biblioteca GlibC
no (como Musl C) gcc
también lanzará error: implicit declaration of function
cuando se encuentran extensiones de GNU como malloc_trim
.
La solución es wrap the extension & the header:
#if defined (__GLIBC__)
malloc_trim(0);
#endif
Al obtener el error: implicit declaration of function
También se enumerarán la función problemática. A menudo, este error ocurre debido a un archivo de encabezado olvidado o perdido, por lo que en el indicador del shell puede escribir man 2 functionname
y mirar la sección SYNOPSIS
en la parte superior, ya que esta sección enumerará los archivos de encabezado que deben incluirse. O intente http://linux.die.net/man/ Esta es la página de manual en línea con hipervínculo y fácil de buscar. Las funciones a menudo se definen en los archivos de encabezado, incluso cualquier archivo de encabezado requerido suele ser la respuesta. Al igual que cnicutar dijo,
está utilizando una función para la que el compilador no ha visto una declaración ("prototipo") todavía.
Creo que la pregunta no es 100% respondida. Estaba buscando un problema con la falta de typeof(), que es la directiva de tiempo de compilación.
siguientes enlaces a brillar la 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
como de conculsion tratan de utilizar __typeof__()
lugar. También gcc ... -Dtypeof=__typeof__ ...
puede ayudar.
Esto también puede ocurrir si olvida incluir un archivo de encabezado. Por ejemplo, si está intentando usar strlen() sin incluir string.h obtendrá este error
Cuando haga su #includes en main.c, ponga la referencia #include al archivo que contiene la función referenciada en la parte superior de la lista de inclusión. p. Decir que esto es main.c y su función 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á la "declaración implícita de la función" error, pero por debajo de voluntad-
#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 de #include, solo un orden diferente.
Bueno, lo hice por mí.
Un "por qué no da una versión de error": http://stackoverflow.com/questions/434763/are-prototypes-required-for-all-functions-in-c89-c90-or-c99 –