avvertenza: dichiarazione di funzione implicita


201

Il mio compilatore (GCC) mi sta dando l'avvertimento:

avvertenza: dichiarazione di funzione implicita

Per favore, aiutami a capire perché sta arrivando.



Questo può accadere anche se si dimentica di includere un file di intestazione. Ad esempio, se stai cercando di usare strlen () senza includere string.h, otterrai questo errore
kurdtpage,

Risposte:


230

Stai utilizzando una funzione per la quale il compilatore non ha ancora visto una dichiarazione (" prototipo ").

Per esempio:

int main()
{
    fun(2, "21"); /* The compiler has not seen the declaration. */       
    return 0;
}

int fun(int x, char *p)
{
    /* ... */
}

Devi dichiarare la tua funzione prima di main, in questo modo, direttamente o in un'intestazione:

int fun(int x, char *p);

9
Inoltre, se hai verificato il prototipo che non è solo un refuso. Anche se proviene da una libreria esterna controlla di averlo incluso.
smitec,

1
Non riesco a eseguire il codice dopo aver ricevuto questo avviso. Quindi si comporta come un errore.
Mien,

@Flimm, C99 e C89 / C90 hanno impostazioni diverse per questo
Come Chen


1
@ZachSaw Giustamente. Altrimenti non ti saresti ripetuto tre volte.
Nima Mousavi l'

19

Il modo giusto è dichiarare il prototipo di funzione nell'intestazione.

Esempio

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 file (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}

7

Quando esegui #includes in main.c, inserisci il riferimento #include nel file che contiene la funzione di riferimento nella parte superiore dell'elenco include. es. Dì che questo è main.c e la tua funzione di riferimento è in "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

Quanto sopra non genererà l'errore "dichiarazione implicita di funzione", ma sotto

#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"    

Esattamente lo stesso elenco #include, solo un ordine diverso.

Bene, lo ha fatto per me.


3

Quando lo ottieni error: implicit declaration of functiondovrebbe anche elencare la funzione offensiva. Spesso questo errore si verifica a causa di un file di intestazione dimenticato o mancante, quindi al prompt della shell è possibile digitare man 2 functionnamee guardare la SYNOPSISsezione in alto, poiché questa sezione elencherà tutti i file di intestazione che devono essere inclusi. Oppure prova http://linux.die.net/man/ Queste sono le pagine man online che sono hyperlink e facili da cercare. Le funzioni sono spesso definite nei file di intestazione, incluso qualsiasi file di intestazione richiesto è spesso la risposta. Come ha detto cnicutar,

Stai utilizzando una funzione per la quale il compilatore non ha ancora visto una dichiarazione ("prototipo").



1

È necessario dichiarare la funzione desiderata prima della funzione principale :

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

int main(void) {

   yourfunc();
 }

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.