trình biên dịch của tôi (GCC) là đem lại cho tôi những cảnh báo:cảnh báo: khai tiềm ẩn của chức năng
cảnh báo: khai tiềm ẩn của chức năng
Xin hãy giúp tôi hiểu tại sao nó lại tới.
trình biên dịch của tôi (GCC) là đem lại cho tôi những cảnh báo:cảnh báo: khai tiềm ẩn của chức năng
cảnh báo: khai tiềm ẩn của chức năng
Xin hãy giúp tôi hiểu tại sao nó lại tới.
Bạn đang sử dụng một chức năng mà trình biên dịch chưa nhìn thấy một tuyên bố ("prototype").
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 phải khai báo chức năng của bạn trước khi chính, như thế này, hoặc trực tiếp hoặc trong một tiêu đề:
int fun(int x, char *p);
Như một sự bổ sung nếu bạn đã đưa ra nguyên mẫu kiểm tra xem 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
Tại sao đây là cảnh báo và không phải là lỗi? – Flimm
Tôi không thể chạy mã sau khi nhận được cảnh báo này. Vì vậy, nó hoạt động như một lỗi. – Mien
Cách đúng là để khai báo hàm nguyên mẫu trong tiêu đề .
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);
}
Alternative với một tập tin (main.c)
static int some_main(const char *name);
int some_main(const char *name)
{
// do something
}
Nếu bạn có tiêu đề chính xác định nghĩa & đang sử dụng một thư viện GlibC
không (ví dụ như Musl C) gcc
cũng sẽ ném error: implicit declaration of function
khi GNU phần mở rộng như malloc_trim
đang gặp phải.
Giải pháp là để wrap the extension & the header:
#if defined (__GLIBC__)
malloc_trim(0);
#endif
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ị lãng quên hoặc bị thiếu, vì vậy tại dấu nhắc trình bao, bạn có thể nhập man 2 functionname
và xem phần SYNOPSIS
ở trên cùng, vì phần này sẽ liệt kê mọi tệp tiêu đề cần được bao gồm. Hoặc thử http://linux.die.net/man/ Đây là trang người trực tuyến mà họ được siêu liên kết và dễ tìm kiếm. Các hàm thường được xác định 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 chức năng mà trình biên dịch chưa thấy khai báo ("nguyên mẫu").
Tôi nghĩ 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.
liên kết sau sẽ chiếu ánh sáng vào từng tình huống:
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
như của conculsion cố gắng sử dụng __typeof__()
để thay thế. Ngoài ra gcc ... -Dtypeof=__typeof__ ...
có thể giúp bạn.
Điều này cũng có thể xảy ra nếu bạn quên bao gồm 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ẽ nhận được lỗi này
Khi bạn thực hiện #includes trong main.c, hãy đặt tham chiếu #include vào tệp chứa hàm được tham chiếu tại đầu danh sách bao gồm. ví dụ: Giả sử đây là main.c và chức năng tham chiếu của bạn là 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 "tuyên bố ngầm của chức năng" lỗi, nhưng dưới will-
#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 #include, chỉ khác thứ tự.
Vâng, nó đã làm cho tôi.
"Tại sao nó không đưa ra một phiên bản lỗi": http://stackoverflow.com/questions/434763/are-prototypes-required-for-all-functions-in-c89-c90-or-c99 –