C语言 生成的头文件不包括用户定义的文件

c3frrgcw  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(123)

当前尝试使用Flex创建lexer。当运行flex pl0_lexer.l命令时,我的pl0_lexer. h中的include语句与我的pl0_lexer. c不匹配。

pl0_lexer.l Sniffer

%option header-file = "pl0_lexer.h"
%option outfile = "pl0_lexer.c"
%option yylineno
%option bison-bridge

%{
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <limits.h>
#include "ast.h"
#include "parser_types.h"
#include "utilities.h"
#include "lexer.h"

 /* Tokens generated by Bison */
#include "pl0.tab.h"
%}

字符串
我的问题是,所有用户定义的头文件(如"ast.h")都出现在.c代码中,但pl0_lexer.h只包括标准的C头文件。

v440hwme

v440hwme1#

正如我在评论中指出的:
这是因为pl0_lexer.h的内容不需要任何其他头来编译。头是最小的-您的代码(在lexer之外)必须包含必要的头。您不能依赖pl0_lexer.h来包含这些头。
生成的头文件提供了使用词法分析器所需的定义--主要是yylex()的适当声明,但也包括支持函数。它不需要知道用户定义的头文件中的任何信息--这些头文件不构成词法分析器接口的一部分。
另请参阅Should I use #include in headers?以了解自包含、幂等、最小头的讨论,以及How to link multiple implementation files in C?
(As顺便说一下,生成的头不符合我对“最小”的定义。例如,它确保定义了像flex_int8_tflex_uint64_t这样的类型名称,但是(对于Flex 2.6.4)header中定义的结构不使用这些类型,所有这些代码都不是直接需要在头文件中的。我不确定在哪里有文档说明词法分析器的消费者必须(或者应该)使用这些类型。)

相关问题