解析C ++预处理器#if语句

时间:2008-11-13 16:18:37

标签: python c++ c parsing c-preprocessor

我有一个带条件编译的C / C ++源文件。在我将它发送给客户之前,我想删除大多数#if语句,以便我的客户不必担心将正确的-D选项传递给编译器。

我已经在Python中实现并使用它,但它只能正确处理#ifdef和#ifndef语句。我需要添加对#if语句的支持,但#if的语法要复杂得多。 (例如,您可以使用&&,||,!,括号,关系运算符,算术等)。

是否有任何现有的开源代码来解析和评估#if语句? (最好是Python)。

我所知道的唯一实现是GCC,这对于这项任务来说太复杂了。

5 个答案:

答案 0 :(得分:14)

作为KeithB said,您可以让预处理器为您执行此操作。

但是如果你不想隐藏东西(即,有条件编译的代码中可能存在你不想要或者不允许给其他人的东西),那么更简单的选择就是只需将正确的#define指令放在全局包含的标题中。

  • 您的客户无需担心-D选项
  • 您不必在构建过程中有一些自定义步骤
  • 您为客户提供的代码不可能是半混淆的
  • 您不会引入错误,因为该工具与C预处理器的工作方式略有不同
  • 您不必维护一些自定义工具

答案 1 :(得分:12)

如何通过C预处理器,并让它完成工作。它将摆脱所有这些,因此您可能需要预先处理器前步骤和后预处理器步骤来保护您不想扩展的内容。

  1. 将所有#include更改为@include
  2. 通过预处理器传递文件
  3. 将@include改回#include

答案 2 :(得分:8)

不要重新发明轮子,而是下载“unifdef”。如果您使用某种Linux版本,可以找到适合它的软件包,否则它就在FreshMeat

答案 3 :(得分:4)

你看过Boost.Wave吗?

答案 4 :(得分:0)

GCC预处理器通常是一个独立的程序,通常称为cpp。当然,这可能也会剥夺你的评论。