如何在没有收到以下警告的情况下使用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);
}
如何删除警告?
最佳答案
strdup
和fileno
都不是ISO C函数,它们都是POSIX的一部分。
现在它们是否在您的平台上可用取决于您的平台。
如果您使用的是Microsoft工具,则可能需要研究 _fileno
(在VC2005中为 fileno
was deprecated)。可以在here中找到一个相当出色的strdup
版本。
尽管用该代码吹了我自己的角,但是您也可以使用 _strdup
,因为它代替了also-deprecated strdup
:-)
希望这些文件可以按原样正常工作,因为它们位于stdio.h
和string.h
中,这是您已经在使用的两个包含文件。
如果您使用的是UNIX派生产品,则这些功能应该在stdio.h
(对于fileno
)和string.h
(对于strdup
)中可用。假设您似乎已经包含这些文件,则该问题可能在其他地方。
一种可能是,如果您要在严格的模式之一(例如gcc中的__STRICT_ANSI__
)中进行编译,则两者都不会被定义。
您应该查看生成的lex.yy.c
和lex.l
文件的顶部,以确认是否包含头文件,并检查要传递给编译器的命令行参数。
关于c - 如何删除以下 'implicit declaration of function'警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9427145/