4

我有一个带有条件编译的 C/C++ 源文件。在将它交付给客户之前,我想删除大部分 #if 语句,这样我的客户就不必担心将正确的 -D 选项传递给编译器。

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

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

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

4

5 回答 5

14

正如KeithB 所说,您可以让预处理器为您执行此操作。

但是,如果您不想隐藏某些东西(即,条件编译的代码中可能存在您不希望或不允许提供给其他人的东西),那么一个更简单的选择就是放#define全局包含的标头中的正确指令。

  • 您的客户无需担心-D选项
  • 您不必在构建过程中有一些自定义步骤
  • 您提供给客户的代码可能不会被半混淆
  • 您不会引入错误,因为该工具所做的事情与 C 预处理器略有不同
  • 您不必维护一些自定义工具
于 2008-11-13T17:02:13.647 回答
12

只是通过 C 预处理器,然后让它完成工作怎么样。它将摆脱所有这些,因此您可能需要一个预处理器步骤和一个后预处理器步骤来保护您不想被扩展的东西。

  1. 将所有#include 更改为@include
  2. 通过预处理器传递文件
  3. 将@include 改回#include
于 2008-11-13T16:25:25.013 回答
8

与其重新发明轮子,不如下载“unifdef”。如果您使用某种 Linux 风格,您可能可以找到它的软件包,否则它在FreshMeat上

于 2008-11-13T16:23:07.733 回答
4

你看过Boost.Wave吗?

于 2008-11-13T16:21:59.560 回答
0

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

于 2008-11-13T16:22:24.677 回答