如何删除以下“隐含的函数声明”警告?

如何使用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  #include  #include  #include  %} 

函数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工具,则可能需要查看后者的_filenofileno在VC2005 中已弃用 )。 这里可以找到相当优秀的strdup版本。

虽然用这个代码吹了我自己的号角,你也可以使用_strdup因为它取代了也被弃用的strdup 🙂

这些应该可以正常工作,因为它们位于stdio.hstring.h ,这是您已经使用的两个包含文件。


如果您使用的是UNIX衍生产品,那么这些函数应该在stdio.h (对于fileno )和string.h (对于strdup )中可用。 鉴于您看起来已经包含了这些文件,问题可能在其他地方。

一种可能性是,如果你正在编译一个严格的模式,如gcc中的__STRICT_ANSI__ ,那么两者都不会被定义。

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

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

 #define _POSIX_C_SOURCE 1 

人们似乎近年来已经收紧了function控制,并且希望当一致性良好且普遍存在时,我们可以抛弃自动化垃圾。

考虑添加以下行:

 extern char *strdup(const char *s); 

我用-std=c99 -pedantic -pedantic-errors编译时遇到了问题。 添加以上行解决了我的问题。

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

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

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

您在使用它之前声明该函数:

 //declare the function int storeLexeme(); //use the function here 

或包含声明函数的标头。

C隐式假设未声明的函数具有返回类型int并从您调用函数的方式中推导出参数。 这在C ++中已弃用。