如何删除以下'隐式函数声明'警告?
如何在不收到以下警告的情况下使用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
或包括其中函数声明的标题:
使用之前你声明的功能。
Ç隐含地假定未申报的功能有返回类型int
并推导出从你如何调用该函数的参数。这在C++中已被弃用。
我在包含库之后使用它之前已经声明了该函数,并且仍然收到警告。 – idealistikz 2012-02-24 07:56:52
它不是storeLexeme函数,它抱怨它是从那里调用的。 – paxdiablo 2012-02-24 08:01:12
你是否还声明'strdup'和'fileno'或包含头文件? – 2012-02-24 08:01:34
无论strdup
也不fileno
是ISO C函数,它们是POSIX的一部分。
现在,无论他们是在您的平台上取决于您的平台。
如果您使用的是微软的开发工具,你可能想看看_fileno
后者(在VC2005 fileno
was deprecated)。 strdup
的一个相当优秀的版本可以被发现here。
虽然已经吹我自己的喇叭与该代码,您还可以使用_strdup
,因为它取代了also-deprecated strdup
:-)
这些应该有希望的工作没关系,-是因为他们在stdio.h
和string.h
,二您正在使用的包含文件。
如果你使用的是UNIX的衍生物,这些功能应该在stdio.h
(为fileno
)和string.h
(为strdup
)可用。鉴于它看起来像已经包含这些文件,问题可能在其他地方。
一种可能性是,如果你在严格的模式,如在GCC __STRICT_ANSI__
),那里既没有将被定义的一个编译。
你应该看看你产生lex.yy.c
和lex.l
文件的顶部,以确认头文件是被列入,并检查命令行参数你传递给编译器。
像'_fileno'一样,如果使用MS工具,也有'_strdup'。 – 2012-02-24 08:13:40
想在这里添加一下,我使用的是Linux(debian/ubuntu),并且必须使用-D _GNU_SOURCE进行编译才能使编译器从wchar.h – ThePosey 2014-02-10 19:24:44
我建议这个选项(告诉你正在使用POSIX编译):
#define _POSIX_C_SOURCE 1
人们似乎在最近几年已经收紧的功能控制,希望当一致性好和广泛,我们可以扔掉automake垃圾。
中识别此函数,您可能会考虑将其添加一次-D_POSIX_C_SOURCE = 1 'Makefile(或Makefile.am) – 2017-06-20 13:01:09
我在使用flex时也遇到了这个问题。
我用-std=gnu99
而不是-std=c99
解决了这个问题。
flex lang.l && gcc -o lexer -std=gnu99 lex.yy.c -lfl
我更改了flex标签,因为它是关于Adobe flex而不是GNU lex克隆。 – 2012-02-24 08:08:39
什么平台,UNIX或Windows? – paxdiablo 2012-02-24 08:10:02
那些不是'图书馆';他们是'头'。链接中使用库;源代码引用标题。 – 2012-12-05 03:40:15