cảnh báo: khai báo hàm


201

Trình biên dịch của tôi (GCC) đang đưa ra cảnh báo cho tôi:

cảnh báo: khai báo hàm

Xin hãy giúp tôi hiểu tại sao nó lại đến.


1
"Tại sao nó không đưa ra phiên bản lỗi": stackoverflow.com/questions/434763/
triệt

Điều này cũng có thể xảy ra nếu bạn quên bao gồm một tệp tiêu đề. Ví dụ: nếu bạn đang cố gắng sử dụng strlen () mà không bao gồm chuỗi.h bạn sẽ gặp lỗi này
Kurdtpage

Câu trả lời:


230

Bạn đang sử dụng một hàm mà trình biên dịch chưa thấy khai báo (" nguyên mẫu ").

Ví dụ:

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

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

Bạn cần khai báo hàm của bạn trước hàm chính, như thế này, trực tiếp hoặc trong tiêu đề:

int fun(int x, char *p);

9
Là một bổ sung nếu bạn đã đưa ra kiểm tra nguyên mẫu rằng nó không chỉ là một lỗi đánh máy. Ngoài ra nếu nó từ một thư viện bên ngoài kiểm tra rằng bạn đã bao gồm nó.
smitec

1
Tôi không thể chạy mã sau khi tôi nhận được cảnh báo này. Vì vậy, nó hành xử như một lỗi.
Miên

@Flimm, C99C89 / C90 có các cài đặt khác nhau cho việc này
Cách Chen


1
@ZachSaw Đúng vậy. Khác, bạn sẽ không lặp đi lặp lại ba lần.
Nima Mousavi

19

Cách đúng là khai báo nguyên mẫu hàm trong tiêu đề.

Thí dụ

chính

#ifndef MAIN_H
#define MAIN_H

int some_main(const char *name);

#endif

C chính

#include "main.h"

int main()
{
    some_main("Hello, World\n");
}

int some_main(const char *name)
{
    printf("%s", name);
}

Thay thế bằng một tệp (main.c)

static int some_main(const char *name);

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

7

Khi bạn thực hiện #includes của mình trong main.c, hãy đặt tham chiếu #include vào tệp có chứa hàm được tham chiếu ở đầu danh sách bao gồm. ví dụ: Nói đây là main.c và chức năng được tham chiếu của bạn nằm trong "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

Ở trên sẽ không tạo ra lỗi "khai báo hàm ẩn", nhưng bên dưới sẽ-

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

Chính xác cùng một danh sách #incoide, chỉ khác thứ tự.

Vâng, nó đã làm cho tôi.


3

Khi bạn nhận được error: implicit declaration of functionnó cũng nên liệt kê các chức năng vi phạm. Thường thì lỗi này xảy ra do tệp tiêu đề bị quên hoặc bị thiếu, vì vậy, tại dấu nhắc shell, bạn có thể nhập man 2 functionnamevà xem SYNOPSISphần ở trên cùng, vì phần này sẽ liệt kê bất kỳ tệp tiêu đề nào cần được đưa vào. Hoặc thử http://linux.die.net/man/ Đây là trang người dùng trực tuyến mà họ siêu liên kết và dễ tìm kiếm. Các hàm thường được định nghĩa trong các tệp tiêu đề, bao gồm mọi tệp tiêu đề bắt buộc thường là câu trả lời. Giống như cnicutar đã nói,

Bạn đang sử dụng một hàm mà trình biên dịch chưa thấy khai báo ("nguyên mẫu").


2

Nếu bạn có các tiêu đề chính xác được xác định & đang sử dụng một GlibCthư viện không (chẳng hạn như Musl C ) gcccũng sẽ ném error: implicit declaration of functionkhi các phần mở rộng GNU như malloc_trimgặp phải.

Giải pháp là bọc phần mở rộng & tiêu đề :

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

1

Bạn cần khai báo hàm mong muốn trước hàm chính của bạn :

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

int main(void) {

   yourfunc();
 }

0

Tôi nghĩ rằng câu hỏi không được trả lời 100%. Tôi đã tìm kiếm vấn đề với thiếu typeof (), đó là chỉ thị thời gian biên dịch.

Các liên kết sau sẽ chiếu sáng tình hình:

https://gcc.gnu.org/onlinesocs/gcc-5.3.0/gcc/Typeof.html

https://gcc.gnu.org/onlinesocs/gcc-5.3.0/gcc/Alternate-Keywords.html#Alternate-Keywords

__typeof__()thay vì cố gắng sử dụng thay thế. Cũng gcc ... -Dtypeof=__typeof__ ...có thể giúp đỡ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.