Saya compiler (GCC) adalah memberikan peringatan:
peringatan: deklarasi implisit dari fungsi
Tolong bantu saya memahami mengapa itu datang.
Anda menggunakan fungsi yang kompilator tidak melihat pernyataan ("prototype") belum.
Misalnya:
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);
Cara yang tepat adalah untuk menyatakan prototipe fungsi pada header.
#ifndef MAIN_H
#define MAIN_H
int some_main(const char *name);
#endif
utama.c
#include "main.h"
int main()
{
some_main("Hello, World\n");
}
int some_main(const char *name)
{
printf("%s", name);
}
Alternatif dengan satu file (utama.c)
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
Ketika anda melakukan #termasuk dalam utama.c, menempatkan #termasuk referensi ke file yang berisi dirujuk fungsi di bagian atas seperti daftar. misalnya, Katakan ini adalah utama.c dan direferensikan fungsi di "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 "deklarasi implisit dari fungsi" kesalahan, namun 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 sama #include daftar, hanya berbeda urutan.
Nah, hal itu untuk saya.
Ketika anda mendapatkan kesalahan: deklarasi implisit dari fungsi
itu juga harus daftar menyinggung fungsi. Sering kesalahan ini terjadi karena lupa atau hilang file header, sehingga pada prompt shell anda bisa ketik man 2 functionname
dan melihat SINOPSIS
di bagian atas, karena bagian ini akan menampilkan daftar file header yang harus disertakan. Atau mencoba http://linux.die.net/man/ Ini adalah online pria halaman mereka hyperlink dan mudah untuk mencari.
Fungsi-fungsi yang sering didefinisikan dalam file header, termasuk apapun yang diperlukan file header yang sering menjawab. Seperti cnicutar berkata,
Anda menggunakan fungsi yang kompilator tidak terlihat deklarasi ("prototipe") belum.
Jika anda memiliki header yang benar didefinisikan & menggunakan non GlibC
perpustakaan (seperti Musl C) gcc
juga akan membuang error: deklarasi implisit dari fungsi
ketika GNU ekstensi seperti malloc_trim
yang ditemui.
Solusinya adalah untuk membungkus ekstensi & header]2:
#if defined (__GLIBC__)
malloc_trim(0);
#endif
Saya pikir pertanyaan ini tidak 100% menjawab. Saya sedang mencari masalah dengan hilang typeof(), yang waktu kompilasi direktif.
Link berikut akan bersinar cahaya pada situasi:
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
sebagai conculsion mencoba untuk menggunakan __jenis__()
sebagai gantinya. Juga gcc ... -Dtypeof=__jenis__ ...
dapat membantu.