了解GCC依赖编译指示

时间:2019-07-18 21:59:22

标签: c gcc code-generation pragma

我正在探索gcc支持的编译指示,但我听不清manual#pragma GCC dependency的评价:

  

#pragma GCC dependency允许您检查当前文件和另一个文件的相对日期。如果另一个文件比当前文件更新,则会发出警告。如果当前文件是从另一个文件派生的,并且应该重新生成,这将很有用。使用常规包含搜索路径搜索另一个文件。可选的尾随文本可用于在警告消息中提供更多信息。

谁能用最少的代码解释这部分?

  

如果当前文件是从另一个文件派生的,这很有用

如何从另一个文件派生当前文件?我可以理解如何从当前文件派生另一个文件,而反之亦然

1 个答案:

答案 0 :(得分:1)

  

如何从另一个文件派生当前文件?我可以   了解如何从当前文件派生另一个文件,但是   不是反之亦然

服务的主要情况是由程序使用指定的其他文件作为输入创建C源文件。通过运行程序,C源代码是从另一个文件派生的。可以假定其他文件中的差异将导致代码生成器程序以不同的方式生成C文件(至少一点点),否则将不使用所讨论的编译指示。

因此,如果指定的其他文件的最后修改时间戳记比C文件的最新时间戳,则极有可能完全在编译C文件,因为它可能与其他文件的当前版本不符。相反,应该通过再次运行代码生成器程序从另一个文件重新生成C源代码,获得一个新版本的C文件以替换当前文件。当然,新文件的最后修改时间戳要比另一个文件新,因为另一个文件必须存在,然后才能从中生成新版本的C文件。

示例:

有一个名为lex的经典程序,其目的是帮助编写处理文本的程序,尤其是编程语言或丰富数据语言的文本(细节并不重要)。该程序的输入文件描述了如何识别和分类该语言的基本单位,这些基本单位称为“令牌”。如果要分析的语言是C,则标记将包括语言关键字,数字常量和运算符。 lex的输入文件通常为数十行。

lex读取这样的输入文件,并编写一个C源文件,该文件定义了几个功能以及一些内部表,这些功能和表实现了所需的“扫描”行为:读取输入文本并将其分解为令牌,并报告给令牌。给它的呼叫者。该程序生成的C源代码通常有几千行长,与小得多的输入文件相比,它概括地说了lex有用的原因。

要构建一个扫描所涉及语言的程序,可以提供一个功能(在不同的源文件中),该功能可以调用lex生成的函数,并将其与lex生成的C源代码一起编译。获得完整的程序。假设lex输入文件被命名为language.l,并且在该文件上运行lex的输出被命名为language.c。如果要更改扫描仪功能的行为,则要做的是修改(小型,简单)language.l,然后重新运行lex以重新生成language.c

当我以任何有意义的方式更改language.l时,language.c会过时,直到我通过重新运行language.llex生成新版本为止。如果我编译了language.c的过时版本,则结果不能反映language.l的当前版本。这通常在构建程序的人员方面构成错误,#pragma GCC dependency提供了一种在这种情况下从编译器发出警告的机制。