用C实现预编器的操作——#include和#define

1 篇文章 0 订阅
1 篇文章 0 订阅

本文讲述如何在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) 算法概要描述

  1. PreCompile的实现:使用Stack,递归调用是必须,每次发现#include文件操作就把文件的内容读出,如果读出的文件还包含#include操作就再次读出,注意每次要检查#include包含的头文件是否在Stack中是否存在,如果有则不要读那个文件,如果没有就把文件名插入到Stack中,读文件操作完以后就从Stack中取一个个文件名,读出文件并把文件内容写入预编译的文件中。
  2. HongCompile的实现:C中没有C++一样的容器,我们就建立两个数组,一个数组代表宏,另一个数组代表宏的值,每次插入一个宏(假设为宏1)和它的值之前都要检查这个宏是否出现在别的宏的值中(条件1),是的话(假设出现在别的宏为宏2)再检查要插入的宏1的值中是否包含宏2(条件2),其实就是相互检查,如果两个条件都满足的话就要提示宏1和宏2冲突了,否则继续插入宏。

5) 源代码(免费的哦)

      http://download.csdn.net/detail/u012397189/8543703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CuteXiaoKe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值