2011-12-09 14 views
140

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.

+1

"Dlaczego nie podaje wersji błędu": http://stackoverflow.com/questions/434763/are-prototypes-example-for-all-functions-in-c89-c90-or-c99 –

Odpowiedz

163

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

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

+40

Dlaczego jest to ostrzeżenie, a nie błąd? – Flimm

+1

Nie mogę uruchomić kodu po otrzymaniu tego ostrzeżenia. Więc zachowuje się jak błąd. – Mien

13

Prawo sposobem jest zadeklarować prototyp 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); 
} 

alternatywna z jednym plikiem (main.c)

static int some_main(const char *name); 

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

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 
2

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").

0

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:

5

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.

Powiązane problemy