C 我应该为lex函数创建头文件吗?

C 我应该为lex函数创建头文件吗?,c,linker,lex,C,Linker,Lex,我有一个lex input.l文件,其中包含一系列规则和函数定义,用于在遇到这些规则时使用 我正在使用另一个源文件main.c中的扫描仪 在main.c中,我可以调用yylex(),而不必对生成的lex文件进行任何类型的引用。为什么这样做有效?我正在使用cmake,我注意到它从我的lexer.c文件中创建了一个对象,并将其链接到我的可执行文件。我本以为我需要一个对yylex()的外部引用,这样才能工作 我的问题是,我应该在单独的头文件中为我在lex.l文件中使用的所有函数创建转发声明,并将其包含

我有一个lex input.l文件,其中包含一系列规则和函数定义,用于在遇到这些规则时使用

我正在使用另一个源文件main.c中的扫描仪

在main.c中,我可以调用yylex(),而不必对生成的lex文件进行任何类型的引用。为什么这样做有效?我正在使用cmake,我注意到它从我的lexer.c文件中创建了一个对象,并将其链接到我的可执行文件。我本以为我需要一个对yylex()的外部引用,这样才能工作

我的问题是,我应该在单独的头文件中为我在lex.l文件中使用的所有函数创建转发声明,并将其包含在lex文件中吗?更进一步,我是否应该在lex文件之外定义这些函数,并通过引用include文件来使用它们

您可以毫无问题地调用
yylex()
,因为它是一个
int
函数。所以从技术上讲,您不需要原型(尽管这不是正确的C99或C1x行为)


为所有外部(公共)类型、变量和函数创建一个头文件总是一个好主意。您不需要将其包含在lex源文件中,但这样做是一个非常好的主意(如果没有其他要求,请检查您的声明是否正确)。您肯定应该在任何使用lex函数的文件中包含它的头。

您应该启用警告,并注意任何和所有编译器消息。编译器将准确地告诉您在何处缺少哪些声明。一般来说,您定义的任何可公开访问的函数都应该在某个头中声明,并且该头应该包含在使用该函数的任何文件中。这很有意义,并且某种程度上证实了我的想法。