คำเตือน: การประกาศฟังก์ชันโดยปริยาย


201

คอมไพเลอร์ (GCC) ของฉันกำลังส่งคำเตือน:

คำเตือน: การประกาศฟังก์ชันโดยปริยาย

โปรดช่วยฉันเข้าใจว่าทำไมมันถึงมา


1
A "ทำไมจึงไม่ให้รุ่นข้อผิดพลาด": stackoverflow.com/questions/434763/ …
Ciro Santilli 郝海东冠状病病六四事件

สิ่งนี้อาจเกิดขึ้นได้หากคุณลืมใส่ไฟล์ส่วนหัว ตัวอย่างเช่นหากคุณพยายามใช้ strlen () โดยไม่ใส่ string.h คุณจะได้รับข้อผิดพลาดนี้
kurdtpage

คำตอบ:


230

คุณกำลังใช้ฟังก์ชั่นที่คอมไพเลอร์ไม่ได้เห็นการประกาศ (" ต้น ")

ตัวอย่างเช่น:

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

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

คุณต้องประกาศฟังก์ชั่นของคุณก่อนหน้า main เช่นนี้โดยตรงหรือในส่วนหัว:

int fun(int x, char *p);

9
นอกจากนี้หากคุณให้ต้นแบบการตรวจสอบว่ามันไม่ใช่แค่การพิมพ์ผิด นอกจากนี้หากมาจากห้องสมุดภายนอกตรวจสอบว่าคุณได้รวมไว้
smitec

1
ฉันไม่สามารถเรียกใช้รหัสหลังจากได้รับคำเตือนนี้ ดังนั้นจึงทำงานเหมือนข้อผิดพลาด
เมี่ย

@Flimm, C99และC89 / C90มีการตั้งค่าที่แตกต่างกันสำหรับเรื่องนี้
How Chen


1
@ZachSaw ถูกต้องแล้ว มิฉะนั้นคุณจะไม่ซ้ำรอยตัวเองสามครั้ง
Nima Mousavi

19

วิธีที่ถูกต้องคือการประกาศฟังก์ชั่นต้นแบบในส่วนหัว

ตัวอย่าง

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

ทางเลือกพร้อมไฟล์เดียว (main.c)

static int some_main(const char *name);

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

7

เมื่อคุณทำ #includes ของคุณใน main.c ให้ใส่การอ้างอิง #include ไปยังไฟล์ที่มีฟังก์ชันที่อ้างอิงที่ด้านบนของรายการ include เช่นบอกว่านี่คือ main.c และฟังก์ชั่นอ้างอิงของคุณอยู่ใน "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

ด้านบนจะไม่สร้างข้อผิดพลาด "การประกาศโดยนัยของฟังก์ชัน" แต่ด้านล่างจะ -

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

#include รายการเดียวกันทุกคำสั่งที่แตกต่างกัน

มันทำเพื่อฉัน


3

เมื่อคุณได้รับerror: implicit declaration of functionมันควรจะแสดงรายการฟังก์ชั่นที่ละเมิด บ่อยครั้งที่ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากไฟล์ส่วนหัวที่ถูกลืมหรือหายไปดังนั้นที่เชลล์พรอมต์คุณสามารถพิมพ์man 2 functionnameและดูที่SYNOPSISส่วนด้านบนเนื่องจากส่วนนี้จะแสดงรายการไฟล์ส่วนหัวที่จำเป็นต้องรวม หรือลองhttp://linux.die.net/man/นี่คือหน้าเว็บออนไลน์ที่มีไฮเปอร์ลิงก์และง่ายต่อการค้นหา ฟังก์ชั่นมักจะถูกกำหนดไว้ในไฟล์ส่วนหัวรวมถึงไฟล์ส่วนหัวใด ๆ ที่จำเป็นมักจะเป็นคำตอบ เช่นเดียวกับ cnicutar กล่าวว่า

คุณกำลังใช้ฟังก์ชั่นที่คอมไพเลอร์ไม่ได้เห็นการประกาศ ("ต้น")


2

หากคุณมีส่วนหัวที่ถูกต้องที่กำหนดไว้ & กำลังใช้งานGlibCห้องสมุดที่ไม่ใช่(เช่นMusl C ) gccก็จะโยนerror: implicit declaration of functionเมื่อส่วนขยาย GNU เช่นmalloc_trimพบ

วิธีแก้คือห่อส่วนขยาย & ส่วนหัว :

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

1

คุณต้องประกาศฟังก์ชั่นที่ต้องการก่อนฟังก์ชั่นหลักของคุณ:

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

int main(void) {

   yourfunc();
 }

0

ฉันคิดว่าคำถามไม่ได้ตอบ 100% ฉันกำลังค้นหาปัญหากับ typeof () ที่หายไปซึ่งเป็นคำสั่งรวบรวมเวลา

ลิงค์ต่อไปนี้จะส่องแสงในสถานการณ์:

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

พยายามใช้__typeof__()แทน ยังgcc ... -Dtypeof=__typeof__ ...สามารถช่วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.