gpt4 book ai didi

c - 实现 C#include 指令的内部处理

转载 作者:行者123 更新时间:2023-12-02 01:04:05 26 4
gpt4 key购买 nike

我需要以最简洁的方式为 C 编译器实现 #include 指令的功能。

我只知道如何实现处理的外部部分:获取行首的 '#' 字符以运行仅预处理器循环,我还知道如何收集 "include" 字符串和 <>"" 之间的字符串.

我不知道的是实现内部处理以运行#include 指令的实际效果的最佳方法:扩展库头文件的完整路径(使用 <> )但不扩展使用 "" 的库头文件(它是假设它们在当前目录中可能更清晰、更灵活,因为这也允许正确包含具有完整路径的源文件。

我认为我需要执行的任务是:

  • 作为命令行参数传递给编译器的主 C 文件应该像处理 #include "mainfile.c" 指令一样以统一的方式开始编译。

  • 扩展包含引号的文件的路径("",单引号 '' 是否至少对某些编译器有效?)

  • 将文件放在文件列表中,同时指出我们在哪一行和哪个文件中找到了 #include 指令

  • 在预处理器阶段,看是否是#include指令,尝试无条件打开指定文件,尝试从头开始正确获取所有文件。如果一个文件不存在,不要在预处理器阶段发出错误信号,只有当我们将它们标记为可用时,当我们确定是否应该包含它们时由于 #ifdef#elif ,同时尝试翻译实际C代码。

  • 在处理完代码中的所有 #includes 后,现在处理其余的预处理器代码以及要包含的全套潜在文件。

我认为使用一堆文件会有用,但只有在完成预处理器阶段之后,并且当我们已经翻译了整个代码并添加文件时(将文件索引压入源文件堆栈的 #include 并弹出文件索引源文件的末尾。)

我认为处理代码的最简单方法是检查 #include 指向的所有文件,列出它们,然后只标记为可用,我将实际包括的那些和完全处理,那些满足 #ifdef#elif 条件的,但为此我需要查看整个源文件集中有哪些包含文件。

最佳答案

您通常会在阅读时处理所有预处理器指令。因此,当您看到 #include 时,您会获得文件名、搜索包含路径、打开文件并开始处理它——无需延迟。到达包含文件的末尾后,您将继续处理原始文件。

#if 类似,您读取条件并确定它是真还是假。如果为 false,则开始跳过输入,忽略它,直到找到匹配的 #else#endif。因此,如果那里有 #include,您只需跳过它。

关于c - 实现 C#include 指令的内部处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48753050/

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