实验1 编译预处理
ps:AI版实验报告
[实验目的]:
1.了解程序设计语言的编译系统;
2. 从编译程序的角度理解程序设计语言。
[实验内容]:
请设计一个编译预处理程序对源程序进行处理,产生标准源程序。C语言编译系统的预处理器主要完成一下3个功能。
(1) 注释处理。 C语言提供了两种注释形式:
A:单行注释,“//”结构,如:
//这是一个单行注释,C99标准引入
B:多行注释也称块注释或经典注释,“/* /”结构,如:
/这是一个经典注释,C89标准引入/
注意:多行注释注释不能嵌套,且遵循就近匹配原则。
/这是一个多行的著述
/嵌套注释/
/
上面这个注释会报错,因为C语言的经典注释符号遵循就近匹配原则,第一行/会和第二行的/进行匹配,形成一个完整的经典注释,然后最后一个/就悬空了,就会报错,所以经典注释(快注释)不要在注释中引入/符号。
但是以下注释是合法的:
/
//在其中嵌入第二种注释
*/
(2)宏处理。 C语言允许用户在程序中定义宏,以提高编程效率。如:
#define PI ,3.1415926
预处理器将源程序的所有符号PI换成3.1415926
(3)文件包含。 如果C源程序中含有#include “stack.h”,那么预处理器处理到这条语句时,用stack.h的实际内容替换该语句。
(4)条件编译。[选做] 并非源程序的每一行都要进行编译,有时情况不同要编译程序的不同语句。C语言预处理器处理条件编译,将真正需要编译的语句组成标准源程序。
学生可以用c语言或其他程序设计语言来实现编译预处理器程序。
[实验要求]:
每位同学撰写一份试验报告,并提交电子版的源程序和实验报告。
实验报告的要求:
(1)程序流程图(为节约时间,可手工画图再拍照插入文档)
(2)源程序(写出核心代码/函数)
#include <iostream>
#include <fstream>
#include <sstream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 用于存储宏定义
unordered_map<string, string> macros;
// 处理文件包含
void handleInclude(const string &filename, ostringstream &output) {
ifstream file(filename);
if (!file.is_open()) {
cerr << "Error opening file: " << filename << endl;
return;
}
output << file.rdbuf(); // 读取整个文件内容
file.close();
}
// 移除注释
void removeComments(string &line) {
// 处理单行注释
size_t singleLineCommentPos =<