uyarı: örtük işlev bildirimi


203

Derleyicim (GCC) bana şu uyarıyı veriyor:

uyarı: örtük işlev bildirimi

Lütfen neden geldiğini anlamama yardımcı olun.



Bu, bir başlık dosyası eklemeyi unutursanız da olabilir. Örneğin, string.h içermeden strlen () kullanmaya çalışıyorsanız bu hatayı alırsınız
kurdtpage 11:16

Yanıtlar:


231

Derleyicinin henüz bir bildirim (" prototip ") görmediği bir işlev kullanıyorsunuz .

Örneğin:

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

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

Doğrudan veya bir başlıkta, ana gibi önce işlevinizi bildirmeniz gerekir:

int fun(int x, char *p);

9
Ek olarak, prototip verdiyseniz, bunun sadece bir yazım hatası olmadığını kontrol edin. Ayrıca, harici bir kütüphaneden eklediğinizi kontrol edin.
smitec

1
Bu uyarıyı aldıktan sonra kodu çalıştıramıyorum. Yani bir hata gibi davranıyor.
Mien

@Flimm, C99 ve C89 / C90 bunun için farklı ayarlara sahip
How Chen


1
@ZachSaw Haklı olarak. Yoksa kendini üç kez tekrarlamazdın.
Nima Mousavi

19

Doğru yol başlıkta işlev prototipini bildirmektir.

Misal

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

Tek bir dosya ile alternatif (main.c)

static int some_main(const char *name);

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

7

#İncludes'inizi main.c dosyasında yaptığınızda, #include referansını dahil edilenler listesinin en üstünde başvurulan işlevi içeren dosyaya yerleştirin. Örneğin, bunun main.c olduğunu ve başvurulan işlevin "SSD1306_LCD.h" olduğunu söyleyin

#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

Yukarıdaki "örtük işlev bildirimi" hatası oluşturmayacak, ancak aşağıda

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

Tam olarak aynı #include listesi, sadece farklı bir düzen.

Benim için oldu.


3

Bunu aldığınızda error: implicit declaration of function, rahatsız edici işlevi de listelemelidir. Genellikle bu hata, unutulmuş veya eksik başlık dosyası nedeniyle oluşur, bu nedenle kabuk isteminde , üstteki bölüme yazabilir man 2 functionnameve bakabilirsiniz SYNOPSIS, çünkü bu bölüm dahil edilmesi gereken başlık dosyalarını listeleyecektir. Ya da http://linux.die.net/man/ adresini deneyin Bu, köprülenmiş ve aranması kolay çevrimiçi adam sayfalarıdır. İşlevler genellikle başlık dosyalarında tanımlanır, gerekli başlık dosyaları da dahil olmak üzere genellikle yanıttır. Cnicutar'ın dediği gibi,

Derleyicinin henüz bir bildirim ("prototip") görmediği bir işlev kullanıyorsunuz.


2

Tanımlı doğru başlıklara sahipseniz ve GlibCkütüphane olmayan bir ( Musl C gibi ) kullanıyorsanız gcc, error: implicit declaration of functiongibi GNU uzantılarıyla malloc_trimkarşılaşıldığında da atar .

Çözüm, uzantıyı ve başlığı sarmaktır :

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

1

Ana işlevinizden önce istenen işlevi bildirmeniz gerekir :

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

int main(void) {

   yourfunc();
 }

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.