解析C++预处理器#if语句
我有一个C/C++的源文件,其中包含条件编译的代码。在我把它发给客户之前,我想去掉大部分的#if语句,这样客户就不用担心给编译器传递正确的-D选项了。
我已经在Python中实现了这个功能,但目前只处理了#ifdef和#ifndef语句。现在我需要添加对#if语句的支持,但#if的语法要复杂得多。(比如,你可以使用&&、||、!、括号、关系运算符、算术运算等等)。
有没有现成的开源代码可以解析和计算#if语句?(最好是用Python写的)。
我知道的唯一实现是GCC,但那对于这个任务来说太复杂了。
5 个回答
8
与其重新发明轮子,不如下载“unifdef”。如果你使用的是某种Linux系统,可能可以找到它的安装包;如果找不到,可以去FreshMeat网站上下载。
12
我们可以先把文件交给C语言的预处理器来处理,这样它就能帮我们解决这个问题。预处理器会把所有需要处理的内容都去掉,所以你可能需要在处理之前和之后做一些额外的步骤,以保护那些你不想被处理的内容。
- 把所有的 #include 改成 @include
- 把文件交给预处理器处理
- 再把 @include 改回 #include
14
正如KeithB所说,你可以让预处理器来帮你处理这些事情。
但是,如果你并不是想要隐藏什么(也就是说,条件编译的代码里可能有一些你不想或者不允许给别人看的内容),那么一个更简单的办法就是在一个全局包含的头文件里放入合适的#define
指令。
- 你的客户就不需要担心
-D
选项了 - 你也不需要在构建过程中增加一些自定义的步骤
- 你给客户的代码不会变得模糊不清
- 你不会因为工具的处理方式和C预处理器稍有不同而引入错误
- 你也不需要维护一些自定义的工具