2010-01-27 17 views
25

मेरा सी कोड 'मेमसेट' और 'क्लोज' का उपयोग करता है। और मैं जोड़ लिया है:कंपाइलर चेतावनी 'फ़ंक्शन मेमसेट की निहित घोषणा'

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

लेकिन मैं अभी भी इन चेतावनियों मिलती है:

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’ 

क्या आप मुझे बता सकते हैं कि मैं इन चेतावनियों को कैसे हल कर सकते हैं?

धन्यवाद।

उत्तर

66

आप की जरूरत है:

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

अपने कोड में।

संदर्भ: close के लिए POSIX, memset के लिए सी मानक।

+0

हाँ, शुरुआत में मैंने शीर्षक और चेतावनियों का पहला भाग देखा था। अपडेट किया गया। –

+1

+1 प्रश्न पूछने के लिए कहां से जानकारी प्राप्त करने के लिए। @OP: अनुमान मत लगाओ, इसे देखो! –

+0

सहित विंडोज़ पर जीसीसी 4.8 में memcpy की बात आती है जब असंगत निहित घोषणा चेतावनी की मेरी समस्या का हल भी किया। –

28

एक अच्छा तरीका findout करने के लिए क्या हेडर फाइल आप याद कर रहे हैं:

man <section> <function call> 

पता लगाने के लिए खंड उपयोग:

apropos <function call> 

उदाहरण:

man 3 memset 
man 2 send 

के जवाब में संपादित करें जेम्स मॉरिस:

  • अनुभाग | विवरण
  • 1 जनरल कमांड
  • 2 प्रणाली कॉल
  • 3 सी पुस्तकालय कार्यों
  • 4 विशेष फ़ाइलें (आमतौर पर उपकरणों, उन/dev में पाया जाता है) और ड्राइवरों
  • 5 फ़ाइल प्रारूप और परंपराओं
  • 6 गेम्स और स्क्रीनसेवर
  • 7 Miscellanea
  • 8 सिस्टम प्रशासन कमांड और डेमन्स

स्रोत: Wikipedia Man Page

+2

शायद बताएं कि धारा 3 और सेक्शन 2 क्यों? –

+0

'मैन मेमसेट' आपको 'string.h' शामिल करने के लिए भी बताएगा। समाधान – Noich

+2

+1, आपको 'स्मृति' (3) 'घोषित करने के लिए '#' शामिल करना होगा। –

0

पुराना सवाल है, लेकिन मैं वही समस्या थी और मैं अनुवाद इकाई के शीर्ष पर

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

या सिर्फ

extern void* memset(); 

जोड़ने (द्वारा इसे हल * सीसी फाइल)।

+0

नहीं देने के बजाय हमें एक सामान्य समाधान देकर शिक्षण के लिए – vonbrand

+0

आप * कानूनी रूप से लाइब्रेरी फ़ंक्शंस घोषित कर सकते हैं (यही वह है जो मानक शीर्षलेख करता है), लेकिन ऐसा करने का कोई अच्छा कारण नहीं है। –

+0

बीटीडब्ल्यू, मेमसेट, memcpy, आदि हमेशा लाइब्रेरी कार्यों नहीं हैं। वे एक कंपाइलर के अंतर्निर्मित कार्य हो सकते हैं। उदाहरण के लिए, मेरे एम्बेडेड सिस्टम के लिए एसडीके में मेरे पास कोई हेडर "string.h" नहीं है। इसलिए, चेतावनी को दबाकर बिल्ड लॉग को साफ करने का एकमात्र तरीका है। –

5

अपने ग फ़ाइल के शुरू में अगले जोड़ने परिभाषित करने के लिए प्रयास करें:

#define _GNU_SOURCE 

यह मेरे pipe2 समारोह के साथ मदद की।

13

memset आपको हेडर string.h फ़ाइल आयात करने की आवश्यकता है। तो बस निम्नलिखित शीर्षलेख

#include <string.h> 
... 
संबंधित मुद्दे