概述
本文讲述如何在debianlinux系统下编译并运行预编译器——#include和#define的实现,在windows下的话直接编译源文件就行了(当然运行的时候要在命令行中输入文件名)
1) 文件结构
源代码文件:PreCompile.cHongCompile.c Stack.c
头文件:Stack.h
要编译的文件:main.ca.h b.h c.h
其中PreCompile在系统中编译时需要Stack.c和Stack.h的支持,PreCompile实现的#include头文件的实现,HongCompile实现的是#define宏定义的实现,至于要编译的a.h,b.h和c.h的文件内容就不具体介绍了,请打开文件自己查阅,主要是main.c包含a.h和b.h,a.h包含c.h和b.h,b.h包含a.h(a.h,b.h相互包含,在编译时只需编译一次),然后main.c,a.h,b.h,c.h中分别有宏NUMBER_MAIN,NUMBER_A,NUMBER_B和NUMBER_C,除了NUMBER_MAIN以外,其余宏的值都为整数,而NUMBER_MAIN宏的值为NUMBER_A*NUMBER_B*NUMBER_C。
2) 具体操作
1. 先把上述的所有文件拷贝到linux的文件目录下:/root/,先确认你的提示符为root@主机名:~#,以后出现#代表的是你的命令行提示符。
2. 输入#gcc –c PreCompile.c –I/root/和 #gcc–c Stack.c –I/root/ 会生成两个文件:PreCompile.o和Stack.o
3. 输入#gcc –o PreCompile PreCompile.o Stack.o生成可执行程序PreCompile再次输入#gcc –o HongCompile HongCompile.c生成可执行程序HongCompile(此时有可能会出现warnning,可以不管)
4. 输入#/root/PreCompile main.c以后你会发现main.c文件中#include头文件都消失了,取而代之的#include头文件里面的内容已经全部复制到main.c里面了。
5. 再次输入#/root/HongCompile main.c以后你会发现main.c中#define部分已经去除,凡是出现定义的宏都被替换了宏的值。
3) 宏定义操作的引申
有时候宏替换也有可能引发冲突,比如在a.h中定义的NUMBER_A的值假如设为NUMBER_B+20(这是可行的,因为a.h中包含b.h),而b.h中定义的NUMBER_B的值设为NUMBER_A+40,此时如果编译的话就会出现错误,我们要做的是能够发现并提示错误。我们先把之前的没有进行2)操作的文件main.c,c.h和修改过的a.h和b.h复制粘贴到linux中,按照上面的操作输入#/root/PreCompile main.c和#/root/HongCompile main.c以后发现会提示宏有冲突。
4) 算法概要描述
- PreCompile的实现:使用Stack,递归调用是必须,每次发现#include文件操作就把文件的内容读出,如果读出的文件还包含#include操作就再次读出,注意每次要检查#include包含的头文件是否在Stack中是否存在,如果有则不要读那个文件,如果没有就把文件名插入到Stack中,读文件操作完以后就从Stack中取一个个文件名,读出文件并把文件内容写入预编译的文件中。
- HongCompile的实现:C中没有C++一样的容器,我们就建立两个数组,一个数组代表宏,另一个数组代表宏的值,每次插入一个宏(假设为宏1)和它的值之前都要检查这个宏是否出现在别的宏的值中(条件1),是的话(假设出现在别的宏为宏2)再检查要插入的宏1的值中是否包含宏2(条件2),其实就是相互检查,如果两个条件都满足的话就要提示宏1和宏2冲突了,否则继续插入宏。
5) 源代码(免费的哦)
http://download.csdn.net/detail/u012397189/8543703
最后
以上就是漂亮小蘑菇为你收集整理的用C实现预编器的操作——#include和#define的全部内容,希望文章能够帮你解决用C实现预编器的操作——#include和#define所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复