我试图消除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

我使用的是Mac OSX,所以当我编译它时不会给我任何警告,所以我猜它是linux发行版特有的以下是我拥有的每个文件的头部分,让您了解我已经尝试过的内容:
扫描仪.l
#define _POSIX_SOURCE 1
//#define _GNU_SOURCE

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

分析器.y
#include <stdio.h>
#include <stdlib.h>

int yylex (void);
void yyerror (char const *);

非常感谢您的帮助。

最佳答案

我相信,传统的答案是self-answer中列出的答案:手动声明fileno
我的常规做法(而且,我认为,最常见的解决方案)是将-D_XOPEN_SOURCE=700添加到gcc标志中(700大于声明fileno所需的值,但有时我使用其他Posix特性。)另一种选择是设置_POSIX_C_SOURCE_POSIX_SOURCE已弃用,但它仍然有效。
这些必须是编译器选项,而不是flex输入文件中的#defines,因为在生成的flex代码中,#include <stdio.h>是在用户指定的序言之前插入的,并且特性测试宏需要在首次使用任何标准库头之前定义(有关更多信息,请参见man feature-test-macros和/或the Posix specification。)
因为在编译环境中这是不可能的,所以需要使用一个解决方法如前所述,一种方法是在prolog中手动声明fileno
另一种解决方法是通过指定fileno来避免调用%option never-interactive,这将告诉flex生成一个扫描仪,如果输入是终端,则该扫描仪不会尝试修改其行为。%option always-interactive也可以工作,但由于扫描仪不会在交互环境中使用,因此这是不必要的开销。这些工作是因为fileno仅用于调用isatty(这是unistd.h中的Posix函数)以决定是否激活交互处理如果您告诉flex输入总是或从不交互,那么它不需要这个测试。如果指定fileno选项以避免对输入使用stdio,则还需要read但你不应该。)
我有点惊讶,您课程的编译环境没有在编译步骤中包含适当的功能测试宏定义它应该这样做,你可以把我的建议传递给谁监督构建工具。

09-12 09:11