我知道在我的特定情况下,我可以踢预处理器以使用-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建议或其他建议,请告诉我。
答案 0 :(得分:15)
Eclipse CDT编辑器可以很好地突出显示基于您声明为活动的宏的代码。您可能需要查看它。
答案 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注释,以便我可以使用调试器(gdb
或dbx
或... ...消除思想,sdb
或adb
)在编译的代码上。我还看到了预处理器(cpp
和m4
)用于生成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更简单。