预处理器布鲁斯有什么治疗方法吗?

时间:2009-04-11 00:17:34

标签: c vim c-preprocessor

我知道在我的特定情况下,我可以踢预处理器以使用-E选项吐出输出。对于生成的代码,这个预处理器输出是杀气腾腾的。例如,我有一个4gl的应用程序,而Informix会将其转换为 C ,这反过来会导致一个可怕的丑陋混乱。

我想要的是一个编辑器,它允许我指定有效的预处理器值,并仅向我显示相关代码。我在Vim匹配#ifdef#endif时有一些非常基本的工作,但代码中充斥着更高级的构造,例如#ifndef#if#else 。更糟糕的是,构造在逻辑上更复杂,我认为我的Vim脚本技能不足以让我得到我想要的东西。例如:

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

如果我想解决它,请包括定义表达式求值程序。这必须是一个解决的问题!如果您有Vim建议或其他建议,请告诉我。

6 个答案:

答案 0 :(得分:15)

Eclipse CDT编辑器可以很好地突出显示基于您声明为活动的宏的代码。您可能需要查看它。alt text

答案 1 :(得分:6)

对于编辑,Eclipse CDT效果很好。它显示了哪些代码处于活动状态以及哪些代码是#ifdef'ed out,它在代码中提供语法高亮显示#ifdef'ed out,因此您仍然可以轻松读取它,并且如果您使用鼠标,它可以逐步执行宏扩展在宏观上。

从命令行,cpp -dM filename.c处理文件并仅显示有效的#defines。例如,在您的代码中,它可能会吐出

#define DLEVEL 5
#define SIGNAL 1
#define STACK 200
#define STACKUSE 1

不会使列表与其他预处理程序指令或C / C ++代码混淆。

(在相关说明中,cpp -dM /dev/null是查找平台预定义宏的便捷方式。)

答案 2 :(得分:2)

考虑一下Is there a C pre-processor which eliminates #ifdef blocks based on values defined/undefined?的答案中引用的“Unifdef之子”。这不是一个可视化编辑器 - 但它会采用C代码(或带有C预处理程序指令的代码)并生成一个修改后的文件,然后您可以将其与原始文件进行比较。

我很好奇提到了Informix 4GL(I4GL)。它生成的C代码不是AFAIK,它与#ifdef结构相结合。至少,当我负责输出时,输出不允许包含任何输出。 (你使用的是哪个版本的I4GL?)有很多#line条目;那些允许您将生成的代码追回到相应的I4GL源。我有一个脚本可以将它们转换为简单的C注释,以便我可以使用调试器(gdbdbx或... ...消除思想,sdbadb)在编译的代码上。我还看到了预处理器(cppm4)用于生成I4GL源代码以提交给I4GL编译器。

答案 3 :(得分:1)

如果您是Linux用户并且还使用GNOME,那么我将不得不推荐GEdit。我为Intellisense,文件浏览等安装了一些plugins之后我真的很喜欢它......如果你没有运行GNOME但仍在使用Linux(KDE),那么你可以使用Kate。我没有玩太久,所以我没有太多话要说。 GEdit将在KDE中运行,但看起来不对。

如果你正在使用Windows并拥有一台非常好的PC,那么试试Netbeans(是的,它也适用于C ++,而不仅仅是Java)。如果不是,那么总是Visual C++ 2008(尽管仍然依赖于RAM)。

我不确定Mac,因为我负担不起,但Netbeans也在使用它(以及Linux)。

答案 4 :(得分:1)

Emacs有hide-ifdef模式(我自己从来没有使用它,所以我不能保证它的质量)

答案 5 :(得分:0)

您也可以尝试unifdef,它比sunifdef更简单。