2012-02-24 17 views
11

Come si compila il file lex con gcc senza ricevere i seguenti avvertimenti?Come rimuovere i seguenti avvisi di "dichiarazione implicita di funzione"?

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' 

Queste sono le librerie che ho incluso.

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

La funzione yy_init_buffer non è nel file. La seguente è la funzione 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); 
} 

Come posso rimuovere gli avvertimenti?

+1

Ho modificato il tag flex, in quanto riguarda Adobe flex e non il clone GNU lex. –

+0

Quale piattaforma, UNIX o Windows? – paxdiablo

+2

Quelle non sono "librerie"; sono "intestazioni". Le librerie sono utilizzate nella linea di collegamento; il codice sorgente fa riferimento alle intestazioni. –

risposta

0

si dichiara la funzione prima di usarla:

//declare the function 
int storeLexeme(); 

//use the function here 

o includere l'intestazione in cui viene dichiarata la funzione.

C assume implicitamente che le funzioni non dichiarate abbiano il tipo di ritorno int e deduca i parametri da come si chiama la funzione. Questo è deprecato in C++.

+1

Ho dichiarato la funzione prima di usarla dopo che ho incluso le librerie, e continuo a ricevere gli avvertimenti. – idealistikz

+0

Non è la funzione storeLexeme a lamentarsi del fatto che sia la str_nup _called_ da lì. – paxdiablo

+0

Hai anche dichiarato 'strdup' e' fileno' o includi le intestazioni? –

11

strdupfileno sono funzioni ISO C, fanno parte di POSIX.

Ora se sono disponibili sulla vostra piattaforma dipende dalla vostra piattaforma.


Se si utilizzano gli strumenti di Microsoft, si consiglia di guardare in _fileno per questi ultimi (fileno was deprecated in VC2005). Una versione piuttosto eccellente di strdup può essere trovata here.

Anche se, dopo aver soffiato il mio proprio corno con quel codice, si potrebbe anche usare _strdup in quanto sostituisce il also-deprecated strdup :-)

Questi dovrebbero auspicabilmente funzionare bene così com'è dato che sono in stdio.h e string.h, due dei file include che stai già utilizzando.


Se siete su un derivato di UNIX, queste funzioni dovrebbero essere disponibili in stdio.h (per fileno) e string.h (per strdup). Dato che sembra che tu stia già includendo quei file, il problema è probabilmente altrove.

Una possibilità è se si sta compilando in uno dei modi rigorosi come __STRICT_ANSI__ in gcc), dove nessuno sarebbe definito.

si dovrebbe avere uno sguardo alla parte superiore del vostro generati lex.yy.c e lex.l file per confermare che i file di intestazione sono essere inclusi e anche controllare la linea di comando parametri si sta passando al compilatore.

+0

Come '_fileno', c'è anche' _strdup' se si usano gli strumenti di MS. –

+0

Vorrei solo aggiungere che sto usando Linux (debian/ubuntu) e ho dovuto compilare con -D _GNU_SOURCE per far riconoscere al compilatore questa funzione da wchar.h – ThePosey

8

Suggerisco questa opzione (dire al compilatore che si sta utilizzando POSIX):

#define _POSIX_C_SOURCE 1 

persone sembrano avere inasprito i controlli caratteristica degli ultimi anni e si spera che quando la consistenza è buona e diffusa si può buttare via la spazzatura automake.

+0

potresti considerare di aggiungerlo una volta '-D_POSIX_C_SOURCE = 1 'nel Makefile (o Makefile.am) –

5

considerare l'aggiunta la seguente riga:

extern char *strdup(const char *s); 

ho affrontato il problema quando ho compilato con -std=c99 -pedantic -pedantic-errors. L'aggiunta della riga sopra ha risolto il problema per me.

+1

' extern' è ridondante qui. È una dichiarazione di funzione comunque e senza la parola chiave 'static', il suo collegamento è esterno. – ajay

+0

sì, semplice come questo – 4pie0

4

Ho riscontrato questo problema durante l'utilizzo di Flex.

Ho utilizzato -std=gnu99 anziché -std=c99 che ha risolto il problema.

flex lang.l && gcc -o lexer -std=gnu99 lex.yy.c -lfl       
Problemi correlati