2012-02-24 12 views
11

¿Cómo compilo el archivo lex con gcc sin recibir las siguientes advertencias?¿Cómo elimino las siguientes advertencias de 'declaración implícita de función'?

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' 

Estas son las bibliotecas que incluí.

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

La función yy_init_buffer no está en el archivo. La siguiente es la función 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); 
} 

¿Cómo elimino las advertencias?

+1

Cambié la etiqueta de flexión, ya que se trata de Adobe flex y no del clon GNU lex. –

+0

¿Qué plataforma, UNIX o Windows? – paxdiablo

+2

Esas no son 'bibliotecas'; ellos son 'encabezados'. Las bibliotecas se usan en la línea de enlace; el código fuente hace referencia a los encabezados. –

Respuesta

0

declara la función antes de usarla:

//declare the function 
int storeLexeme(); 

//use the function here 

o incluir la cabecera, donde se declara la función.

C asume implícitamente que las funciones no declaradas tienen el tipo de retorno int y deduce los parámetros de cómo llama a la función. Esto está en desuso en C++.

+1

Declaro la función antes de usarla después de que #incluí las bibliotecas, y todavía recibo las advertencias. – idealistikz

+0

No es la función storeLexeme de la que se queja porque es el strdup _llamado_ desde allí. – paxdiablo

+0

¿También declaraste 'strdup' y' fileno' o incluiste los encabezados? –

11

Ni strdup ni fileno son funciones ISO C, son parte de POSIX.

Ahora, si están disponibles en su plataforma, depende de su plataforma.


Si está utilizando las herramientas de Microsoft, es posible que desee ver en _fileno para este último (fileno was deprecated en VC2005). Se puede encontrar una versión bastante excelente de strduphere.

Aunque, después de haber soplado mi molino con ese código, también se puede utilizar _strdup ya que reemplaza la also-deprecated strdup :-)

Estos esperemos que deberían funcionar bien como está, ya que está en stdio.h y string.h, dos de los archivos de inclusión que ya está utilizando.


Si estás en un derivado de UNIX, estas funciones deben estar disponibles en stdio.h (por fileno) y string.h (por strdup). Dado que parece que ya estás incluyendo esos archivos, es probable que el problema esté en otra parte.

Una posibilidad es si está compilando en uno de los modos estrictos como __STRICT_ANSI__ en gcc), donde no se definiría ninguno.

Usted debe echar un vistazo a la parte superior de sus generadas lex.yy.c y lex.l archivos para confirmar que los archivos de cabecera son ser incluidos y también comprobar la línea de comandos parámetros estás pasando al compilador.

+0

Al igual que '_fileno', también hay' _strdup' si usa herramientas de MS. –

+0

Me gustaría agregar aquí que estoy usando Linux (debian/ubuntu) y tuve que compilar con -D _GNU_SOURCE para que el compilador reconozca esta función desde wchar.h – ThePosey

8

Sugiero esta opción (decirle al compilador que está utilizando POSIX):

#define _POSIX_C_SOURCE 1 

la gente parece haber endurecido los controles de funciones en los últimos años y es de esperar que la consistencia es buena y generalizada podemos tiramos la basura de automake

+0

, puede considerar agregarla una vez '-D_POSIX_C_SOURCE = 1 'en el Makefile (o Makefile.am) –

5

considerar la adición de la siguiente línea:

extern char *strdup(const char *s); 

que enfrentan el problema cuando se compila con -std=c99 -pedantic -pedantic-errors. Agregar la línea anterior resolvió el problema para mí.

+1

' extern' es redundante aquí. Es una declaración de función de todos modos y sin la palabra clave 'static', su enlace es externo. – ajay

+0

sí, tan simple como esto – 4pie0

4

También tuve este problema al usar flex.

He usado -std=gnu99 en lugar de -std=c99 que ha solucionado el problema.

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