Source Insight不能正确识别C/C++宏的解决办法

孟宏才
2023-12-01

Source Insight为我们阅读他人的代码提供了非常方便的功能,但是因为Source Insight的macro token的处理与C/C++的预处理器是不一样的,因此它会将某些宏(声明修饰宏)识别成函数。网上也有针对的解决方案,但这些解决方案并不完整,例如并不能很好解决unimrcp中定义的宏。

虽然我自己的方法也没法完全让Source Insight正确识别unimrcp所有的宏,但效果比网上的已经好很多了。

我的方法也只是对网上的解决方案的一种补充:

修改安装目录下的C.tom

这个就是网上流传的解决方法。按照官网的说法,还可以给每个工程一个独有的C.tom,但我自己试过,行不通。这个文件的作用只是告诉Source Insight某个符号是一个宏,因此并不需要定义宏的值,只需要声明宏的名称就可以了。

注意:修改C.tom后,需要关闭工程,然后打开工程,在build整个工程。

; ';' 表示该行为注释
; unimrcp
MRCP_DECLARE(x)
APT_BEGIN_EXTERN_C
APT_DECLARE(x)
MPF_DECLARE(x)
RTSP_DECLARE(x)
APT_LOG_SOURCE_IMPLEMENT(x,y,z)
APU_DECLARE(x)
MRCP_PLUGIN_LOG_SOURCE_IMPLEMENT(x,y)
MRCP_PLUGIN_DECLARE(x)
ASR_CLIENT_DECLARE(x)
; apr  
APR_INLINE
APR_DECLARE(x)
APR_RING_INIT(x,y,z)
APR_RING_HEAD(x,y)
APR_DECLARE_NONSTD(x)

设置条件宏的值

按照上一步的方法修改C.tom,依然有些宏会被识别成函数,很有可能是受条件宏的影响。这个时候使用Project->Project Settings->Conditions。

遗留问题

Source Insight对复合结构类型中用宏声明的成员也无法识别

 类似资料: