gpt4 book ai didi

c - 摆脱警告 : implicit declaration of function ‘fileno’ in flex

转载 作者:太空宇宙 更新时间:2023-11-04 00:28:39 26 4
gpt4 key购买 nike

我试图摆脱 gcc 在我尝试编译我的 bison 和 flex 文件时抛出的警告:

: In function ‘yy_init_buffer’:
:1675: warning: implicit declaration of function ‘fileno’

我想这样做的原因是因为我正在尝试向我正在参加的类(class)提交作业,但我只能提交“parser.y”和“scanner.l”文件并且它会远程获取编译。问题是:如果有警告(出于某种原因)它会被视为错误,并且因为我无法控制编译器标志,所以我无法让它消失。我在 Internet 上看到了一些关于相同问题的问题,但是所提到的解决方案都不适合我。

编译器使用以下标志:

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 发行版所特有的。这是我拥有的每个文件的 header 部分,以便您了解我已经尝试过的内容:

扫描仪.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 回答中列出的那个:手动声明fileno .

我通常的做法(也是我认为最常见的解决方案)是添加 -D_XOPEN_SOURCE=700到我的 gcc 标志。 (700 比声明 fileno 所需的大,但有时我会使用其他 Posix 功能。)另一种方法是设置 _POSIX_C_SOURCE。 . _POSIX_SOURCE已弃用,但它仍然有效。

这些需要是编译器选项而不是 #define s 在你的 flex 输入文件中,因为在生成的 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。但您不需要也不应该。)

我有点惊讶您类(class)的编译环境在编译步骤中没有包含适当的功能测试宏定义。它应该这样做,您可以将我的建议转达给监督构建工具的任何人。

关于c - 摆脱警告 : implicit declaration of function ‘fileno’ in flex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com