2012-02-24 7 views
11

मैं निम्नलिखित चेतावनियों के बिना जीसीसी के साथ लेक्स फ़ाइल कैसे संकलित करूं?मैं निम्नलिखित 'फ़ंक्शन की अंतर्निहित घोषणा' चेतावनियों को कैसे हटा सकता हूं?

lex.yy.c: In function `yy_init_buffer': 
lex.yy.c:1688: warning: implicit declaration of function `fileno' 
lex.l: In function `storeLexeme': 
lex.l:134: warning: implicit declaration of function `strdup' 

ये पुस्तकालय शामिल हैं I

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
%} 

फ़ंक्शन yy_init_buffer फ़ाइल में नहीं है। फ़ंक्शन storeLexeme निम्न है।

int storeLexeme() { 
for (int i = 0; i < count; i++) { 
    char *curr = *(symbolTable + i); 
    if (strcmp(curr, yytext) == 0) { 
     return i; 
    } 
} 
char *lexeme = (char *)malloc(sizeof(char *)); 
lexeme = (char *)strdup(yytext); 
symbolTable[count] = lexeme; 
count++; 
return (count - 1); 
} 

मैं चेतावनियों को कैसे हटा सकता हूं?

+1

मैंने फ्लेक्स टैग बदल दिया, क्योंकि यह एडोब फ्लेक्स के बारे में है और जीएनयू लेक्स क्लोन नहीं है। –

+0

क्या मंच, यूनिक्स या विंडोज? – paxdiablo

+2

वे 'पुस्तकालय' नहीं हैं; वे 'हेडर' हैं। लिंक लाइन में पुस्तकालयों का उपयोग किया जाता है; स्रोत कोड संदर्भ शीर्षलेख। –

उत्तर

0

आप समारोह की घोषणा से पहले आप इसका इस्तेमाल:

//declare the function 
int storeLexeme(); 

//use the function here 

या हेडर जहां समारोह घोषित किया जाता है शामिल हैं।

सी स्पष्ट रूप से मानता है कि अविकसित कार्यों में वापसी प्रकार int है और आप फ़ंक्शन को कॉल करने के तरीके से पैरामीटर को घटाते हैं। यह सी ++ में बहिष्कृत है।

+1

मैं समारोह घोषित किया था इससे पहले कि मैं यह प्रयोग किया जाता के बाद मैं पुस्तकालयों #included, और मैं अभी भी चेतावनियां प्राप्त हुईं। – idealistikz

+0

यह storeLexeme समारोह इसे बारे में शिकायत कर रहा है वहां से strdup _called_ है नहीं है। – paxdiablo

+0

क्या आपने 'strdup' और' fileno' 'घोषित किया है या हेडर शामिल हैं? –

11

न तो strdup और न ही fileno आईएसओ सी कार्य हैं, वे पीओएसईक्स का हिस्सा हैं।

अब चाहे वे आपके प्लेटफ़ॉर्म पर उपलब्ध हों, आपके प्लेटफ़ॉर्म पर निर्भर करता है।


आप माइक्रोसॉफ्ट उपकरण का उपयोग कर रहे हैं, तो आप बाद (fileno was deprecated VC2005 में) के लिए _fileno पर गौर कर सकते हैं। strdup का एक उत्कृष्ट संस्करण here पाया जा सकता है।

हालांकि, कि कोड के साथ अपने खुद के सींग उड़ा रहा है, दो तुम भी _strdup इस्तेमाल कर सकते हैं, क्योंकि यह also-deprecated strdup :-)

ये उम्मीद है कि ठीक से काम करना चाहिए की जगह के रूप में है, क्योंकि वे stdio.h और string.h में हैं, उन फ़ाइलों को शामिल करें जिनमें आप पहले से उपयोग कर रहे हैं।


आप एक यूनिक्स व्युत्पन्न पर हैं, तो उन कार्यों (fileno के लिए) stdio.h और string.h (strdup के लिए) में उपलब्ध होना चाहिए। यह देखते हुए कि ऐसा लगता है कि आप पहले से ही उन फ़ाइलों को शामिल कर रहे हैं, समस्या कहीं और होने की संभावना है।

एक संभावना यह है कि यदि आप gcc में __STRICT_ANSI__ जैसे सख्त मोड में संकलित कर रहे हैं), जहां न तो परिभाषित किया जाएगा।

आप पुष्टि करते हैं कि हेडर फाइल हैं शामिल किया जा रहा है और यह भी आदेश पंक्ति आप संकलक करने के लिए गुजर रहे हैं मानकों की जांच करने के अपने उत्पन्न lex.yy.c और lex.l फ़ाइलों के शीर्ष पर एक नजर है चाहिए।

#define _POSIX_C_SOURCE 1 

लोग हाल के वर्षों में सुविधा नियंत्रण को कड़ा कर दिया है और उम्मीद है कि जब स्थिरता अच्छा और व्यापक है हम फेंक सकता लगते हैं:

+0

'_fileno' की तरह, वहाँ भी यदि एमएस उपकरण का उपयोग कर रहा है' _strdup'। –

+0

बस यहाँ जोड़ने के लिए है कि मैं लिनक्स का उपयोग कर रहा चाहेंगे (Debian/Ubuntu) और – ThePosey

8

मैं इस विकल्प (संकलक आप POSIX उपयोग कर रहे हैं बताओ) का सुझाव स्वचालित कचरा। जब मैं -std=c99 -pedantic -pedantic-errors साथ संकलित

extern char *strdup(const char *s); 

मैं इस समस्या का सामना करना पड़ा:

+0

wchar.h से इस समारोह पहचान करने के लिए आप 'एक बार -D_POSIX_C_SOURCE = 1 इसे जोड़ने के लिए विचार कर सकते हैं संकलक पाने के लिए डी _GNU_SOURCE साथ संकलित करने के लिए किया था मेकफ़ाइल (या Makefile.am) में –

5

निम्न पंक्ति जोड़ने पर विचार करें। उपर्युक्त रेखा को जोड़ने से मेरे लिए समस्या हल हो गई।

+1

'बाहरी' यहां अनावश्यक है। यह वैसे भी एक कार्य घोषणा है और बिना 'स्थिर' कीवर्ड के, इसकी जुड़ाव बाहरी है। – ajay

+0

हाँ, इस तरह के रूप में सरल – 4pie0

4

मैं भी थोड़ी देर के फ्लेक्स का उपयोग कर इस समस्या थी।

मैंने -std=c99 के बजाय -std=gnu99 का उपयोग किया जिसने समस्या हल की।

flex lang.l && gcc -o lexer -std=gnu99 lex.yy.c -lfl       
संबंधित मुद्दे