Mój kompilator (GCC) daje mi ostrzeżenie:ostrzeżenie: niejawna deklaracja funkcji
ostrzegawczy: niejawny deklarację funkcji
Proszę mi pomóc zrozumieć, dlaczego jest to nadchodzi.
Mój kompilator (GCC) daje mi ostrzeżenie:ostrzeżenie: niejawna deklaracja funkcji
ostrzegawczy: niejawny deklarację funkcji
Proszę mi pomóc zrozumieć, dlaczego jest to nadchodzi.
Używasz funkcji, dla której kompilator jeszcze nie widział deklaracji ("prototyp").
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 głównym, w ten sposób, bezpośrednio lub w nagłówku:
int fun(int x, char *p);
As dodatek, jeśli dałeś prototypowy sprawdzian, że to nie jest tylko literówka. Także, jeśli jest to z zewnętrznej biblioteki, sprawdź, czy go uwzględniłeś. – smitec
Dlaczego jest to ostrzeżenie, a nie błąd? – Flimm
Nie mogę uruchomić kodu po otrzymaniu tego ostrzeżenia. Więc zachowuje się jak błąd. – Mien
Prawo sposobem jest zadeklarować prototyp 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);
}
alternatywna z jednym plikiem (main.c)
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
Jeśli masz poprawne nagłówki zdefiniowane & używasz non GlibC
biblioteki (takie jak Musl C) gcc
również rzucać error: implicit declaration of function
przy napotkaniu rozszerzenia GNU, takie jak malloc_trim
.
Rozwiązaniem jest wrap the extension & the header:
#if defined (__GLIBC__)
malloc_trim(0);
#endif
Kiedy masz error: implicit declaration of function
należy również wymienić funkcję przestępstwa. Często ten błąd występuje z powodu zapomnianego lub brakującego pliku nagłówka, więc w wierszu polecenia powłoki można wpisać man 2 functionname
i przejrzeć sekcję SYNOPSIS
u góry, ponieważ ta sekcja wyświetli listę plików nagłówkowych, które należy uwzględnić. Lub spróbuj http://linux.die.net/man/ To są strony man online, które są hiperlinkowane i łatwe do wyszukania. Funkcje są często definiowane w plikach nagłówkowych, w tym często wymagane są odpowiednie pliki nagłówkowe. Tak jak w przypadku polecenia cnicutar,
Używasz funkcji, dla której kompilator jeszcze nie widział deklaracji ("prototyp").
Myślę, że na pytanie nie udzielono 100% odpowiedzi. Szukałem problemu z brakującym typeof(), który jest dyrektywą czasu kompilacji.
poniższych linków będzie świecić ś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-Keywords.html#Alternate-Keywords
jak z conculsion spróbować użyć __typeof__()
zamiast. Pomocne może też być gcc ... -Dtypeof=__typeof__ ...
.
Może się to również zdarzyć, jeśli zapomnisz dołączyć plik nagłówkowy. Na przykład, jeśli próbujesz użyć funkcji strlen() bez dołączania łańcucha znaków.h, otrzymasz ten błąd:
Po wykonaniu #includes w pliku main.c, umieść odwołanie #include do pliku zawierającego przywoływaną funkcję at górę listy dołączanej. np. Powiedzieć, że to main.c a funkcja odwołuje 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 wygeneruje „niejawny deklarację funkcji” błąd, ale poniżej wola-
#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, tylko inna kolejność.
Cóż, dla mnie.
"Dlaczego nie podaje wersji błędu": http://stackoverflow.com/questions/434763/are-prototypes-example-for-all-functions-in-c89-c90-or-c99 –