Mój kompilator (GCC) ostrzega mnie:
ostrzeżenie: niejawna deklaracja funkcji
Pomóż mi zrozumieć, dlaczego to nadchodzi.
Mój kompilator (GCC) ostrzega mnie:
ostrzeżenie: niejawna deklaracja funkcji
Pomóż mi zrozumieć, dlaczego to nadchodzi.
Odpowiedzi:
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);
Właściwym sposobem jest zadeklarowanie prototypu funkcji w nagłówku.
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
}
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.
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 functionname
i spojrzeć na SYNOPSIS
sekcję 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”).
Jeśli masz zdefiniowane poprawne nagłówki i korzystasz z GlibC
biblioteki innej niż biblioteka (np. Musl C ), gcc
to również wyrzucą, error: implicit declaration of function
gdy rozszerzenia GNU, takie jakmalloc_trim
napotkane są .
Rozwiązaniem jest zawinięcie rozszerzenia i nagłówka :
#if defined (__GLIBC__)
malloc_trim(0);
#endif
Myślę, że na pytanie nie ma 100% odpowiedzi. Szukałem problemu z brakującym typof (), który jest dyrektywą czasu kompilacji.
Poniższe linki rzucą światło na sytuację:
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Typeof.html
https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Alternate-Ke words.html#Alternate-Ke words
od przymusu spróbuj użyć __typeof__()
zamiast tego. gcc ... -Dtypeof=__typeof__ ...
Może również pomóc.