2012-02-24 52 views
11

如何在不收到以下警告的情况下使用gcc编译lex文件?如何删除以下'隐式函数声明'警告?

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' 

这些是我包括的图书馆。

%{ 
#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); 
} 

如何删除警告?

//declare the function 
int storeLexeme(); 

//use the function here 

或包括其中函数声明的标题:

+1

我更改了flex标签,因为它是关于Adobe flex而不是GNU lex克隆。 – 2012-02-24 08:08:39

+0

什么平台,UNIX或Windows? – paxdiablo 2012-02-24 08:10:02

+2

那些不是'图书馆';他们是'头'。链接中使用库;源代码引用标题。 – 2012-12-05 03:40:15

回答

0

使用之前你声明的功能。

Ç隐含地假定未申报的功能有返回类型int并推导出从你如何调用该函数的参数。这在C++中已被弃用。

+1

我在包含库之后使用它之前已经声明了该函数,并且仍然收到警告。 – idealistikz 2012-02-24 07:56:52

+0

它不是storeLexeme函数,它抱怨它是从那里调用的。 – paxdiablo 2012-02-24 08:01:12

+0

你是否还声明'strdup'和'fileno'或包含头文件? – 2012-02-24 08:01:34

11

无论strdup也不fileno是ISO C函数,它们是POSIX的一部分。

现在,无论他们是在您的平台上取决于您的平台。


如果您使用的是微软的开发工具,你可能想看看_fileno后者(在VC2005 fileno was deprecated)。 strdup的一个相当优秀的版本可以被发现here

虽然已经吹我自己的喇叭与该代码,您还可以使用_strdup,因为它取代了also-deprecated strdup :-)

这些应该有希望的工作没关系,-是因为他们在stdio.hstring.h,二您正在使用的包含文件。


如果你使用的是UNIX的衍生物,这些功能应该在stdio.h(为fileno)和string.h(为strdup)可用。鉴于它看起来像已经包含这些文件,问题可能在其他地方。

一种可能性是,如果你在严格的模式,如在GCC __STRICT_ANSI__),那里既没有将被定义的一个编译。

你应该看看你产生lex.yy.clex.l文件的顶部,以确认头文件被列入,并检查命令行参数你传递给编译器。

+0

像'_fileno'一样,如果使用MS工具,也有'_strdup'。 – 2012-02-24 08:13:40

+0

想在这里添加一下,我使用的是Linux(debian/ubuntu),并且必须使用-D _GNU_SOURCE进行编译才能使编译器从wchar.h – ThePosey 2014-02-10 19:24:44

8

我建议这个选项(告诉你正在使用POSIX编译):

#define _POSIX_C_SOURCE 1 

人们似乎在最近几年已经收紧的功能控制,希望当一致性好和广泛,我们可以扔掉automake垃圾。

+0

中识别此函数,您可能会考虑将其添加一次-D_POSIX_C_SOURCE = 1 'Makefile(或Makefile.am) – 2017-06-20 13:01:09

5

考虑添加下面几行:

extern char *strdup(const char *s); 

我所面临的问题,当我与-std=c99 -pedantic -pedantic-errors编译。添加上面的行解决了我的问题。

+1

'extern'在这里是多余的。无论如何这是一个函数声明,没有'static'关键字,它的连接是外部的。 – ajay 2014-01-31 17:06:07

+0

是的,就像这样简单 – 4pie0 2016-07-07 22:58:43

4

我在使用flex时也遇到了这个问题。

我用-std=gnu99而不是-std=c99解决了这个问题。

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