C 摆脱警告:函数的隐式声明‘;文件编号’;灵活的
我试图消除gcc在编译bison和flex文件时发出的警告: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”文件,并且它会被远程编译。问题是:如果有一个警告(出于某种原因)被认为是一个错误,并且因为我无法控制编译器标志,所以我不能让它消失。我在互
: 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,感谢您提到这是一种糟糕的做法。