2010-01-27 28 views
25

Mã c của tôi sử dụng 'memset' và 'close'. Và tôi đã thêm:Cách giải quyết cảnh báo trình biên dịch 'khai báo ngầm định của bộ nhớ chức năng'

#include <stdio.h> 
#include <glib.h> 
#include <stdlib.h> 

Nhưng tôi vẫn nhận được những cảnh báo này:

main.c:259: warning: implicit declaration of function ‘memset’ 
main.c:259: warning: incompatible implicit declaration of built-in function ‘memset’ 
main.c:268: warning: implicit declaration of function ‘close’ 
main.c:259: warning: incompatible implicit declaration of built-in function ‘close’ 

bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể giải quyết những cảnh báo này?

Cảm ơn bạn.

Trả lời

66

Bạn cần:

#include <string.h> /* memset */ 
#include <unistd.h> /* close */ 

trong mã của bạn.

Tham chiếu: POSIX cho close, tiêu chuẩn C cho memset.

+0

Vâng, ban đầu tôi vừa xem tiêu đề và phần đầu tiên của cảnh báo. Đã cập nhật. –

+1

+1 để nói cho người hỏi nơi tìm thông tin. @ OP: Đừng đoán, hãy tra cứu! –

+0

Bao gồm cũng giải quyết được vấn đề của tôi về cảnh báo tuyên bố ngầm không tương thích khi nói đến memcpy trong GCC 4.8 trên Windows. –

28

Một cách tốt để findout gì tập tin tiêu đề bạn đang thiếu:

man <section> <function call> 

Để tìm hiểu việc sử dụng phần:

apropos <function call> 

Ví dụ:

man 3 memset 
man 2 send 

Chỉnh sửa để đáp ứng với James Morris:

  • Mục | lệnh Mô tả
  • 1 chung
  • 2 Hệ thống gọi
  • 3 chức năng thư viện C
  • 4 tác phẩm đặc biệt (thường là các thiết bị, những mặt hàng trong/dev) và trình điều khiển
  • 5 định dạng tập tin và ước
  • 6 Trò chơi và màn hình chờ
  • 7 Miscellanea
  • 8 Lệnh quản trị hệ thống và daemon

Nguồn: Wikipedia Man Page

+2

Có thể giải thích tại sao phần 3 và phần 2? –

+0

'man memset' cũng sẽ cho bạn biết để bao gồm' string.h'. – Noich

+2

+1 cho việc dạy học bằng cách cho chúng ta một giải pháp chung thay vì chỉ đưa ra giải pháp –

0

Cũ câu hỏi nhưng tôi có vấn đề tương tự và tôi giải quyết nó bằng cách thêm

extern void* memset(void*, int, size_t); 

hoặc chỉ

extern void* memset(); 

ở phía trên cùng của đơn vị dịch thuật (* .c).

+0

Không, bạn phải '#include ' để khai báo 'memset (3)'. – vonbrand

+0

Bạn * có thể * tự khai báo các chức năng thư viện một cách hợp pháp (đó là những gì mà tiêu đề chuẩn thực hiện, sau cùng) nhưng không có lý do chính đáng để làm như vậy. –

+0

Btw, memset, memcpy, vv không phải lúc nào cũng là chức năng thư viện. Chúng có thể là các hàm dựng sẵn của trình biên dịch. Ví dụ, tôi không có tiêu đề "string.h" trong SDK cho hệ thống nhúng của tôi. Vì vậy, ngăn chặn cảnh báo là cách duy nhất để làm sạch nhật ký dựng. –

5

Cố gắng thêm bên cạnh xác định lúc bắt đầu của tập tin .c của bạn:

#define _GNU_SOURCE 

Nó giúp tôi với chức năng pipe2.

13

memset yêu cầu bạn nhập tệp tiêu đề string.h. Vì vậy, chỉ cần thêm tiêu đề sau

#include <string.h> 
... 
Các vấn đề liên quan