Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 摆脱警告:函数的隐式声明‘;文件编号’;灵活的_C_Warnings_Bison_Flex Lexer_Suppress Warnings - Fatal编程技术网

C 摆脱警告:函数的隐式声明‘;文件编号’;灵活的

C 摆脱警告:函数的隐式声明‘;文件编号’;灵活的,c,warnings,bison,flex-lexer,suppress-warnings,C,Warnings,Bison,Flex Lexer,Suppress Warnings,我试图消除gcc在编译bison和flex文件时发出的警告: : In function ‘yy_init_buffer’: :1675: warning: implicit declaration of function ‘fileno’ 我之所以想这样做,是因为我正试图向我正在学习的类提交一个赋值,但我只能提交“parser.y”和“scanner.l”文件,并且它会被远程编译。问题是:如果有一个警告(出于某种原因)被认为是一个错误,并且因为我无法控制编译器标志,所以我不能让它消失。我在互

我试图消除gcc在编译bison和flex文件时发出的警告:

: In function ‘yy_init_buffer’:
:1675: warning: implicit declaration of function ‘fileno’
我之所以想这样做,是因为我正试图向我正在学习的类提交一个赋值,但我只能提交“parser.y”和“scanner.l”文件,并且它会被远程编译。问题是:如果有一个警告(出于某种原因)被认为是一个错误,并且因为我无法控制编译器标志,所以我不能让它消失。我在互联网上看到过一些关于同一问题的问题,但上面提到的解决方案都不适合我

编译器使用以下标志:

bison -d -o parser.c parser.y
flex -i -o scanner.c  scanner.l
gcc -std=c99 -pedantic -o test_parser *.c
我使用的是MacOSX,所以当我编译它时,它不会给我任何警告,所以我猜这是linux发行版所独有的。以下是我拥有的每个文件的标题部分,让您了解我已经尝试过的内容:

扫描器

#define _POSIX_SOURCE 1
//#define _GNU_SOURCE

#include <stdio.h>
#include <stdlib.h>
# include "parser.h"
#定义_POSIX_源代码1
//#定义GNU源
#包括
#包括
#包括“parser.h”
语法分析器

#include <stdio.h>
#include <stdlib.h>

int yylex (void);
void yyerror (char const *);
#包括
#包括
int yylex(无效);
无效错误(字符常量*);
非常感谢您的帮助。

通过添加到flex文件,问题(暂时)得到了解决:

int fileno(FILE *stream);

这是一种不好的做法,但这是我唯一能处理它的方法。

我相信,传统的答案是自我回答中列出的答案:手动声明
fileno

我的常规做法(我认为是最常见的解决方案)是将
-D_XOPEN_SOURCE=700
添加到我的gcc标志中。(700大于声明
fileno
所需的大小,但有时我会使用其他Posix功能。)另一种选择是设置
\u Posix\u C_SOURCE
<代码>\u POSIX\u源代码已被弃用,但仍能正常工作

这些需要是编译器选项,而不是flex输入文件中的
#define
s,因为在生成的flex代码中,
#include
在用户指定的序言之前插入,并且在首次使用任何标准库头之前需要定义功能测试宏。(有关详细信息,请参见和/或。)

因为这在编译环境中是不可能的,所以需要使用变通方法。如前所述,一种是在prolog中手动声明
fileno

另一个解决方法是通过指定
%option never interactive
,避免调用
fileno
,该选项告诉flex生成一个扫描器,如果输入是终端,扫描器不会试图修改其行为<代码>%选项始终交互式也可以工作,但由于扫描仪不会在交互式环境中使用,因此这是不必要的开销。这是因为
fileno
仅用于调用
isatty
(这是
unistd.h
中的Posix函数)以决定是否激活交互处理。如果您告诉flex输入总是交互的,或者从不交互的,则不需要进行此测试。(
fileno
如果您指定
read
选项以避免使用stdio进行输入,则也需要此选项。但是您不需要,也不应该这样做。)


我有点惊讶,您课程的编译环境在编译步骤中没有包含适当的特性测试宏定义。它应该做到这一点,您可以将我的建议传递给任何监督构建工具的人。

Bravo,感谢您提到这是一种糟糕的做法。