编写一个简单的 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);
}
我正在尝试编写一个程序来模仿 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);
}