【问题标题】:Parsing C++ preprocessor #if statements解析 C++ 预处理器 #if 语句
【发布时间】:2010-09-22 04:34:01
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    作为KeithB said,你可以让预处理器为你做这件事。

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

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

    【讨论】:

    • 多哈。有时最简单的解决方案是最难以捉摸的。
    【解决方案2】:

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

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

    【讨论】:

    • 这也会杀死 cmets 并扩展所有 #define's。
    • 在回答两个 cmets 时,是的。这就是为什么有另一个步骤将#include(和#define,如果需要)更改为@include/@define。显然,这增加了复杂性。如果可能的话,迈克 B 的解决方案是可行的方法。
    【解决方案3】:

    下载“unifdef”,而不是重新发明轮子。如果你使用某种 Linux 风格,你可能会找到它的包,否则它在 FreshMeat

    【讨论】:

    • 据我所知,这只支持#if 语法的一个子集。 (相当大的子集,但我希望得到全面支持,以避免未来出现 Mike 提到的“错误,因为该工具所做的事情略有不同”)
    【解决方案4】:

    你看过Boost.Wave吗?

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 2022-11-29
        相关资源
        最近更新 更多