我需要以最简洁的方式为 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/