peringatan: deklarasi fungsi implisit


201

Kompiler saya (GCC) memberi saya peringatan:

peringatan: deklarasi fungsi implisit

Tolong bantu saya mengerti mengapa itu datang.



Ini juga dapat terjadi jika Anda lupa menyertakan file header. Sebagai contoh jika Anda mencoba menggunakan strlen () tanpa menyertakan string.h Anda akan mendapatkan kesalahan ini
kurdtpage

Jawaban:


230

Anda menggunakan fungsi di mana kompiler belum melihat deklarasi (" prototipe ").

Sebagai contoh:

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

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

Anda perlu mendeklarasikan fungsi Anda sebelum main, seperti ini, baik secara langsung atau di header:

int fun(int x, char *p);

9
Sebagai tambahan jika Anda telah memberikan prototipe cek bahwa itu bukan hanya kesalahan ketik. Juga jika itu dari perpustakaan eksternal periksa apakah Anda sudah memasukkannya.
smitec

1
Saya tidak dapat menjalankan kode setelah mendapat peringatan ini. Jadi itu berperilaku seperti kesalahan.
Mien

@ Flimm, C99 dan C89 / C90 memiliki pengaturan berbeda untuk ini
How Chen


1
@ ZachSaw Benar begitu. Lain Anda tidak akan mengulangi diri Anda tiga kali.
Nima Mousavi

19

Cara yang benar adalah dengan mendeklarasikan prototipe fungsi di header.

Contoh

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

Alternatif dengan satu file (main.c)

static int some_main(const char *name);

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

7

Saat Anda melakukan #include di main.c, masukkan #include referensi ke file yang berisi fungsi yang dirujuk di bagian atas daftar include. mis. Katakan ini main.c dan fungsi yang direferensikan dalam "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

Di atas tidak akan menghasilkan kesalahan "pernyataan fungsi implisit", tetapi di bawah ini akan

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

Persis #include list yang sama, hanya urutannya berbeda.

Ya, itu berlaku untuk saya.


3

Ketika Anda mendapatkannya, error: implicit declaration of functionharus juga mencantumkan fungsi menyinggung. Seringkali kesalahan ini terjadi karena file header yang terlupakan atau hilang, jadi pada prompt shell Anda dapat mengetik man 2 functionnamedan melihat SYNOPSISbagian di atas, karena bagian ini akan mendaftar file header yang perlu dimasukkan. Atau coba http://linux.die.net/man/ Ini adalah halaman manual daring yang mereka hyperlink dan mudah dicari. Fungsi sering didefinisikan dalam file header, termasuk file header yang diperlukan sering jawabannya. Seperti kata cnicutar,

Anda menggunakan fungsi di mana kompiler belum melihat deklarasi ("prototipe").


2

Jika Anda memiliki tajuk yang benar & menggunakan non GlibCpustaka (seperti Musl C ) gccjuga akan melempar error: implicit declaration of functionketika ekstensi GNU sepertimalloc_trim ditemui.

Solusinya adalah dengan membungkus ekstensi & header :

#if defined (__GLIBC__)
  malloc_trim(0);
#endif

1

Anda perlu mendeklarasikan fungsi yang diinginkan sebelum fungsi utama Anda :

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

int main(void) {

   yourfunc();
 }

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.