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

我知道我可以踢预处理器以在我的特定情况下使用-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建议或其他建议,请告诉我。

Eclipse CDT编辑器可以很好地突出显示基于您声明为活动的宏的代码。 你可能想看看。 替代文字

对于编辑器, 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是一种查找平台预定义宏的便捷方法。)

考虑一下“Son of Unifdef”,在答案中引用是否有一个C预处理器根据定义/未定义的值消除#ifdef块? 。 这不是一个可视化编辑器 – 但它会采用C代码(或其中包含C预处理程序指令的代码)并生成一个修改后的文件,然后您可以将其与原始文件进行比较。

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

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

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

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

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

你也可以尝试unifdef ,这比sunifdef简单得多。