gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:54:15 25 4
gpt4 key购买 nike

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

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

我的问题:通过扫描源文件到达实际的头文件(这仅适用于我编写的头文件,因此应该在源文件所在的文件夹中查找它们)。

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

最佳答案

  • 打开输出文件

  • 您从源文件中逐行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='\0';
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);
}

关于c - 编写一个简单的 C 预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30627021/

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