编写一个简单的 C 预处理器

Write a simple C preprocessor

我正在尝试编写一个程序来模仿 C 预处理器的功能。 所以我的问题是关于扩展 #include "header.h" 语句。

我有一个指向源文件的FILE *指针,所以我需要扫描源文件中包含的所有头文件,对于每一个,进入头文件并将其内容复制到一个新文件,然后将原始源文件复制到新文件,这将导致扩展头文件程序。

我的问题:通过扫描源文件找到实际的头文件(这只是我写的头文件,所以它们应该在源文件所在的文件夹中查找)。

如有任何想法,我们将不胜感激。 (我没有 post 结束我的悲惨尝试,但如果它能以某种方式帮助我,我会 post 他们)。

  • 您打开输出文件

  • fgets 从您的源文件中逐行。

  • 检查每一行是否以 #include 开头。如果不是,请将读取的行复制到您的输出。如果是,请打开名称在 #include 之后的文件并将其内容复制到您的输出。

  • 重复直到输入结束。

以下是您的预处理器(我还没有测试过;它应该可以工作):

#define FALSE   0
#define TRUE    1
#define MAX_LINE 1024

char linebuf[MAX_LINE];
FILE *fpout;

int preprocessor(FILE *fpin);

int main(int argc, char **argv)
{
    FILE *fpin;
    if ((fpout=fopen(argv[2],"w"))==NULL) return(1);
    if ((fpin= fopen(argv[1],"r"))==NULL) return(1);
    preprocessor(fpin);
    fclose(fpin);
    fclose(fpout);
    return(0);
}
int preprocessor(FILE *fpin)
{
    FILE *fpin2;
    while (fgets(linebuf,MAX_LINE,fpin))
    {
        if (strncmp(linebuf,"#include",8)==0) {
            char *cp1, *cp2;
            if ((cp1= strchr(linebuf+9,'"'))==NULL) {fclose(fpin); return(FALSE);}
            if ((cp2= strchr(cp1+1,    '"'))==NULL) {fclose(fpin); return(FALSE);}
            *cp2='[=10=]';
            if ((fpin2=fopen(cp1,"r"))==NULL) {
                printf("File '%s' not found.\n",cp1);
                return(FALSE);
            }
            if (!preprocessor(fpin2)) {fclose(fpin2); return(FALSE);}
            fclose(fpin2);
        }
        else fputs(linebuf, fpout);
    }
    return(TRUE);
}