这是 CDT 页面的摘录,描述了它们的解析和索引(CDT/designs/Overview of Parsing)。它很好地描述了差异是什么以及快速索引器可能失败的地方:
解析和绑定解析是一个缓慢的过程,这是一个问题,因为用户希望内容辅助等代码编辑功能快速。出于这个原因,CDT 将绑定信息存储在称为“索引”或“PDOM”(持久文档对象模型)的磁盘缓存中,以便能够提供快速响应用户请求的功能。
构建索引涉及解析项目中的所有代码、解析所有绑定并将这些绑定写入索引。每次用户编辑文件时,索引都会增量更新。
旧版本的 CDT 支持三种不同的索引模式,快速索引、完全索引和无索引。默认设置是快速索引器,因为索引大型项目可能是一个耗时的过程。快速索引器和完整索引器之间的区别在于,快速索引器会跳过已经解析过一次的头文件,而完整索引器每次包含头文件时总是会重新解析头文件。然而,重要的是要了解完整的索引器,尽管它的名字,仍然不完全准确。
当头文件包含在源文件中时,它受制于当时已定义的任何宏。一些库头文件将宏与预处理器条件 (#ifdefs) 结合使用以部分包含头文件。有时这样的头文件在一个项目中包含不止一次,如果每次包含头文件时,头文件所依赖的宏都不同,那么头文件的不同部分可能包含在不同的源文件中。在这种情况下,两个索引器都不会准确,因为它只会在第一次遇到标头时对其进行索引。
完整索引器将重新解析它已经遇到的标头,但不会重新索引它们。因此,包含标头的源文件可能会被更准确地解析,但标头本身只会被索引一次。完整索引器比快速索引器慢得多,因为它会进行额外的解析,但它只是稍微准确一点。出于这个原因,不推荐使用完整索引器,并且已从当前版本的 CDT 中删除。
每个项目都有一个与之关联的 PDOM。PDOM 作为平面二进制文件存储在磁盘上。索引器只会索引源文件包含的标头,因此如果项目中有一个 .h 文件不包含在任何 .c 或 .cpp 文件中,那么通常它不会被索引。但是,有一个用于索引项目中所有文件的首选项设置。