预处理器布鲁斯有什么治疗方法吗?
我知道我可以踢预处理器以在我的特定情况下使用-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注释,以便我可以在编译的代码上使用调试器( gdb
或dbx
或…消除思想, sdb
或adb
)。 我还看到用于生成I4GL源代码的预处理器(包括cpp
和m4
),用于提交给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简单得多。