ostrzeżenie: niejawna deklaracja funkcji

201

Mój kompilator (GCC) ostrzega mnie:

ostrzeżenie: niejawna deklaracja funkcji

Pomóż mi zrozumieć, dlaczego to nadchodzi.

Angus
źródło
1
„Dlaczego nie wyświetla wersji błędu”: stackoverflow.com/questions/434763/...
Ciro Santilli 13 冠状 病 六四 事件 法轮功
Może się tak również zdarzyć, jeśli zapomnisz dołączyć plik nagłówka. Na przykład, jeśli próbujesz użyć strlen () bez
dołączenia łańcucha.h

Odpowiedzi:

230

Używasz funkcji, dla której kompilator nie widział jeszcze deklaracji („ prototypu ”).

Na przykład:

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

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

Musisz zadeklarować swoją funkcję przed main, tak jak to, bezpośrednio lub w nagłówku:

int fun(int x, char *p);
cnicutar
źródło
9
Jako dodatek, jeśli sprawdziłeś prototyp, że nie jest to tylko literówka. Również jeśli pochodzi z zewnętrznej biblioteki, sprawdź, czy ją załączyłeś.
smitec,
1
Nie mogę uruchomić kodu po otrzymaniu tego ostrzeżenia. Zachowuje się jak błąd.
Mien
@Flimm, C99 i C89 / C90 ma inne ustawienia
How Chen
3
@Flimm stackoverflow.com/questions/434763/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@ZachSaw Słusznie tak. W przeciwnym razie nie powtórzyłbyś się trzykrotnie.
Nima Mousavi,
19

Właściwym sposobem jest zadeklarowanie prototypu funkcji w nagłówku.

Przykład

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

Alternatywnie z jednym plikiem (main.c)

static int some_main(const char *name);

int some_main(const char *name)
{
    // do something
}
Faizal Pribadi
źródło
7

Kiedy wykonujesz #include w main.c, umieść odniesienie #include do pliku zawierającego funkcję, do której się odwołuje, na górze listy dołączeń. np. Powiedzmy, że to main.c, a twoja funkcja, o której mowa, znajduje się w „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

Powyższe nie spowoduje wygenerowania błędu „niejawnej deklaracji funkcji”, ale poniżej -

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

Dokładnie ta sama lista #include, po prostu inna kolejność.

Cóż, zrobiło to dla mnie.

tomc
źródło
3

Kiedy go dostaniesz error: implicit declaration of function, powinien również wyświetlić funkcję przestępcy. Często ten błąd występuje z powodu zapomnianego lub brakującego pliku nagłówka, więc w wierszu polecenia możesz wpisać man 2 functionnamei spojrzeć na SYNOPSISsekcję u góry, ponieważ ta sekcja będzie zawierać listę plików nagłówka, które należy dołączyć. Lub spróbuj http://linux.die.net/man/ To są strony man online, do których prowadzą hiperłącza i są łatwe do przeszukiwania. Funkcje są często definiowane w plikach nagłówków, w tym wszelkie wymagane pliki nagłówków są często odpowiedzią. Jak powiedział cnicutar,

Używasz funkcji, dla której kompilator nie widział jeszcze deklaracji („prototypu”).

Dwayne
źródło
2

Jeśli masz zdefiniowane poprawne nagłówki i korzystasz z GlibCbiblioteki innej niż biblioteka (np. Musl C ), gccto również wyrzucą, error: implicit declaration of functiongdy rozszerzenia GNU, takie jakmalloc_trim napotkane są .

Rozwiązaniem jest zawinięcie rozszerzenia i nagłówka :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif
Stuart Cardall
źródło
1

Musisz zadeklarować żądaną funkcję przed funkcją główną :

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

int main(void) {

   yourfunc();
 }
Poussy
źródło