source insight 条件编译代码分析技巧(快速定位#)

source insight 条件编译代码分析技巧

条件编译是C语言的一大特色。基于C实现的工程中,版本控制,平台移植以及调试输出很大程度上是通过条件编译实现的。

但是多层嵌套复杂的条件编译却给代码分析带来困难,特别是面对规模庞大的代码群。就当前工作而言,在GUI部分这种情况还很少见,因为GUI部分的程序变动大,逻辑相对简单。如果看过WinMgr程序,会发现在一 函数内部存在数套层级的条件编译开关,而这些开关大都与版本控制相关,同时缺少相应的文档,我们对这些开关不 解,给理解带来困难。

此前,本人的处理方式是人为手动的模拟Preprocessor进行开关解除,费时费力。不得不承认,Source Insight(SI) 到了所有程序员所希望的。下面介绍SI中的条件解析功能——Edit Conditions。如果您早就 ,请告知,本人向您虚心请教;如果也遭受过,希望对您有帮助。

Source Insight对编译开关(以下简称Conditions)划分为两类:全局性(Global Conditions——G类)和工程相关的(Project Specific Conditions——PS类)。所谓的G类,作用域是所有的SI工程文件;就是说一旦设定某一Condition为G类,日后新建工程进行全工程解析(build 或rebuild) 的时候,将该Condition纳入进行条件解析。PS类就是这些Conditions仅对当前工程有效。

原则上说,对RD-DVD工程进行PS类解析比较适合,因为RD-DVD每期变动有大有小,尤其是底层。例如,对于如下的编译条件每期版本的值可能是不同的:
MODX2
MODX2_HELP
MODX3
MODX3_NET
MODX3_PATCH

但是其中涉及 易操作性的问题。由于SI没有提供类似于Import与Export的文件操作,独立SI工程间的Conditions集合无法快捷的共享,这样,如果对每一 SI工程进行手动设置Conditions集合,势必是比较繁琐的。鉴于此,推荐使用G类Conditions设置。

G类:顶层菜单Options -> Preferences -> Language选项卡 -> Global Conditions,对每一 Condition进行手动添加,设定True或False或具体的值;单击OK保存。

PS类:顶层菜单Options -> Preferences -> Language选项卡 -> Project Specific Conditions,设置如前。

注意点:
1.由于G类是全局性的,更换新工程时,有可能对Conditions进行再设定;
2.添加新Conditions后,对于“是否进行Rebuild的”提示,选择“否”是可以实现实时的解析更新;如果确实无法实时解析,那就只能选“是”。
3.上下文式快捷菜单——edit condition同样可以实现Conditions的设置。
4..CF3文件是SI的配置文件,使用Options -> Load Configuration命令可以实现G类Conditions共享。

Edit Condition

很多代码尤其是驱动代码,当中有大量的预编译定义,以实现对不同硬件配置的支持。在阅读这样的代码时最痛苦的是不能简单判断程序实际执行的代码分枝。大量分枝同时存在,常常会混淆我们的视听。比如对于下面的代码:

#ifdef DEV1
/* DEV1代码代码 */
#else
/* 其它设备执行代码 */
#endif

如果确定我们当前分析的是DEV1的执行情况 ,那么可以选中DEV1然后单击右键在弹出菜单中选则Edit Condition 选项,在弹出的Conditional Parsing窗口中把DEV1的值设置为True,那么 #ifdef DEV1就等价于#if 1 ,相当注释掉 #else分枝的代码(颜色会变灰)。反之,设置为Flase时,则注释掉#ifdef DEV1分枝的代码。 

你可能感兴趣的:(综合)