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.
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.
Câu trả lờ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 ").
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);
Cách đúng là khai báo nguyên mẫu hàm trong tiêu đề.
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
}
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.
Khi bạn nhận được error: implicit declaration of function
nó 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 functionname
và xem SYNOPSIS
phầ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").
Nếu bạn có các tiêu đề chính xác được xác định & đang sử dụng một GlibC
thư viện không (chẳng hạn như Musl C ) gcc
cũng sẽ ném error: implicit declaration of function
khi các phần mở rộng GNU như malloc_trim
gặp phải.
Giải pháp là bọc phần mở rộng & tiêu đề :
#if defined (__GLIBC__)
malloc_trim(0);
#endif
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 đỡ.