The cross-reference file is generated after full pre-processing and parsing of sources (supporting both K&R and ANSI styles). When it comes to pre-processor constructions, Xref-Speller provided some means on how to address it by retaining the original position from a source code of each symbol which is rooted from a macro expansion.
During the parsing, symbol tables are constructed and the name lookup is conformed to the C language standards. Xref-Speller also see to it that only the selected symbol is browsed even if there are several symbols of the same name (concerns mainly structure records), given the fact that Xref-Speller has a 100% of correct links and automatic symbol resolution.
In addition to the accessible data for browsing are nearly all program symbols including functions, static variables, type names, struct/union records, macros, labels, local variables, formal arguments and even some correspondences.
When it comes to seemingly large projects, the tag file was designed to have a very compact attribute. An example would be a complete cross-references of Linux kernel sources take only about 20Mb of disk space (for 50MB of source code). However, it would merely take about 30 minutes to index whole Linux kernel sources on an AMD-475Mhz.
It pays to take note that an efficient update of tag file will reparse only those files which were modified since the last cross-referencing.