2011-12-09 38 views
140

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.

+1

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 –

Respuesta

163

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); 
+7

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

+40

¿Por qué es esto una advertencia y no un error? – Flimm

+1

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

13

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

Ejemplo

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

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 
2

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.

0

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

5

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

Cuestiones relacionadas