如何在没有收到以下警告的情况下使用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);
 }

如何删除警告?

最佳答案

strdupfileno都不是ISO C函数,它们都是POSIX的一部分。

现在它们是否在您的平台上可用取决于您的平台。

如果您使用的是Microsoft工具,则可能需要研究 _fileno (在VC2005中为 fileno was deprecated)。可以在here中找到一个相当出色的strdup版本。

尽管用该代码吹了我自己的角,但是您也可以使用 _strdup ,因为它代替了also-deprecated strdup :-)

希望这些文件可以按原样正常工作,因为它们位于stdio.hstring.h中,这是您已经在使用的两个包含文件。

如果您使用的是UNIX派生产品,则这些功能应该在stdio.h(对于fileno)和string.h(对于strdup)中可用。假设您似乎已经包含这些文件,则该问题可能在其他地方。

一种可能是,如果您要在严格的模式之一(例如gcc中的__STRICT_ANSI__)中进行编译,则两者都不会被定义。

您应该查看生成的lex.yy.clex.l文件的顶部,以确认是否包含头文件,并检查要传递给编译器的命令行参数。

关于c - 如何删除以下 'implicit declaration of function'警告?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9427145/

10-11 19:39