2011-12-09 29 views
140

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.

+1

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

Trả lời

163

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

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

+40

Tại sao đây là cảnh báo và không phải là lỗi? – Flimm

+1

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

13

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

Ví dụ

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 
} 
2

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 
2

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").

0

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.

0

Đ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

5

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.

Các vấn đề liên quan