当我尝试编译我的野牛和弹性文件时,我试图摆脱gcc抛出的警告:
my @a = qw"abc def efg ghy klm ghn";
my @b = qw"def ghy jgk lom com klm";
print "arrays equal\n"
if @a == @b and join("\0", @a) eq join("\0", @b);
我之所以这样做是因为我试图将作业提交到我正在参加的课程,但我只能提交" parser.y"和" scanner."文件和远程编译。问题是:如果有警告它(由于某种原因)被认为是错误,并且由于我无法控制编译器标志,我无法使其消失。我在互联网上看到了同样问题的一些问题,但没有提到的解决方案对我有用。
编译器使用以下标志:
: In function ‘yy_init_buffer’:
:1675: warning: implicit declaration of function ‘fileno’
我使用的是Mac OSX,所以当我编译它时并没有给我任何警告,所以我猜测它是linux发行版独有的东西。这是我所拥有的每个文件的标题部分,因此您可以了解我已尝试过的内容:
scanner.l
bison -d -o parser.c parser.y
flex -i -o scanner.c scanner.l
gcc -std=c99 -pedantic -o test_parser *.c
parser.y
#define _POSIX_SOURCE 1
//#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
# include "parser.h"
非常感谢这里的任何帮助。
答案 0 :(得分:6)
我认为传统的答案是自答案中列出的答案:手动声明fileno
。
我的正常做法(而且,我认为,最常见的解决方案)是将-D_XOPEN_SOURCE=700
添加到我的gcc标志中。 (700大于fileno
声明所需的大小,但有时我会使用其他Posix功能。)另一种方法是设置_POSIX_C_SOURCE
。 _POSIX_SOURCE
已被弃用,但仍然有效。
这些需要是flex输入文件中的编译器选项而不是#define
s,因为在生成的flex代码中,在用户指定的序言之前插入了#include <stdio.h>
,并且需要使用功能测试宏在第一次使用任何标准库头之前定义。 (有关详细信息,请参阅man feature-test-macros和/或the Posix specification。)
由于在编译环境中无法实现这一点,因此您需要使用变通方法。如上所述,一个是在你的序言中手动声明fileno
。
另一种解决方法是通过指定fileno
来避免调用%option never-interactive
,这会告诉flex生成一个扫描程序,如果输入是终端,则扫描程序不会尝试修改其行为。 %option always-interactive
也可以使用,但由于扫描程序不会在交互式环境中使用,因此这是一种不必要的开销。这些工作是因为fileno
仅用于调用isatty
(unistd.h
中的Posix函数)以决定是否激活交互式处理。如果你告诉flex输入总是或从不交互,它就不需要这个测试。 (如果您指定fileno
选项以避免使用stdio进行输入,则还需要read
。但是,您不应该这样做。(
我对您的课程的编译环境在编译步骤中没有包含适当的功能测试宏定义感到有些惊讶。它应该这样做,你可以将我的建议传递给负责监督构建工具的人。
答案 1 :(得分:2)
通过添加到flex文件(暂时)解决了问题:
int fileno(FILE *stream);
这是一种不好的做法,但这是我处理它的唯一方法。