如何删除以下“隐含的函数声明”警告?
如何使用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); }
如何删除警告?
strdup
和fileno
都不是ISO C函数,它们是POSIX的一部分。
现在,它们是否可用于您的平台取决于您的平台。
如果您使用的是Microsoft工具,则可能需要查看后者的_fileno
( fileno
在VC2005 中已弃用 )。 这里可以找到相当优秀的strdup
版本。
虽然用这个代码吹了我自己的号角,你也可以使用_strdup
因为它取代了也被弃用的strdup
🙂
这些应该可以正常工作,因为它们位于stdio.h
和string.h
,这是您已经使用的两个包含文件。
如果您使用的是UNIX衍生产品,那么这些函数应该在stdio.h
(对于fileno
)和string.h
(对于strdup
)中可用。 鉴于您看起来已经包含了这些文件,问题可能在其他地方。
一种可能性是,如果你正在编译一个严格的模式,如gcc中的__STRICT_ANSI__
,那么两者都不会被定义。
您应该查看生成的lex.yy.c
和lex.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 ++中已弃用。